none
MSSQL2000の即時更新レプリケーションのsaユーザーのパスワード設定について RRS feed

  • 質問

  • 初めて投稿させていただきます。


    1台のPCにSQLサーバーのインスタンスを4つ構築。
    全てのインスタンスで幾つかのテーブルを共有、
    各インスタンスへはASP.Netで作成したアプリケーションで更新し、
    更新された情報は即時に各インスタンスに反映する必要があります。
    (但し、パブリッシャ側からの更新は無いとお考え下さい。)
    既存アプリケーションへの影響を抑えたいという理由もあり、
    即時更新レプリケーションを使用を考えて設定しました。
    パブリッシャー側からの更新はかなり遅延してサブスクライバに反映されますが、
    サブスクライバからの更新は以下のエラーが発生して更新することができません。
    "[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user'sa'."

    sp_link_publicationを実行し、saユーザーにパスワードを設定するようにしましたが、
    正常終了し、再度、パブリッシャー側からの更新を試みますが、
    saユーザーのログインに失敗したというメッセージが表示されて更新することができません。
    saユーザーのパスワード設定の方法をご教授いただけないでしょうか?

    設定に問題がありそうな気がしますが、ウィザードで設定すると細かいところがよく分からないため、
    可能でしたら手動でレプリケーションを構築する方法をお教え下さい。

    ※.当方でMSDNを調べてみましたが、SQL2005で構築する方法はありましたが、
    SQL2000ではsp_addlogreader_agentに無いため、そこから先に進めないでいます.

    環境は以下の通りです。
    OS:Windows2003Server(SP1)
    DBMS:SQL Server Enterprise Edition(SP4)

    よろしくお願いいたします。
    2006年3月8日 8:06

回答

  • 松本です。こんにちは

    私も以前試したときに sp_link_publication がうまく動かなかった記憶が
    あったので、改めて以下のように試してみました。

    EXEC sp_link_publication @publisher = 'PEPPER\SQL2K' --パブリッシャ名
        , @publisher_db =  'North2' --パブリッシュ対象の DB 名
        , @publication = 'North2'   --パブリケーション名
        , @security_mode = 0        --認証方法を SQL Server 認証に
        , @login = 'sa'             --ログイン名
        , @password = 'XXXXX'       -- sa のパスワード

    US のニュースグループだと、これでうまくいくよ、みたいな結論になっている
    のが多いのですが、私が試した限りでは、うまくいきませんでした ^^;

    なので、sp_helptext で sp_link_publication の中身を見ると...

    sp_helptext 'sp_link_publication'

      :
    EXEC @retcode = master.dbo.xp_repl_encrypt @enc_password OUTPUT
      :
    update MSsubscription_properties
    set
    publisher_login = @login,
    publisher_password = @enc_password,
    publisher_security_mode = @security_mode,
    distributor = isnull(@distributor, distributor)
    where UPPER(publisher) = UPPER(@publisher)
    and publisher_db = @publisher_db
    and publication = @publication

    となっていたので、即時更新の認証がらみの設定は、
    サブスクライバ側の MSsubscription_properties テーブルであることが
    分かります。クエリアナライザでサブスクライバへ接続して

    USE データベース名
    SELECT * FROM MSsubscription_properties

    とすると中身を確認できます。
    sp_link_publication 実行後も publisher_password が空であることから、
    sp_link_publication が失敗していることを確認できます。

    ■ 回避策は MSsubscription_properties を直接更新??
    なので、強引に、このテーブルを UPDATE ステートメントで直接更新したら、
    うまくログインできて即時更新できるようになりました。

    サブスクライバへ接続して、

    USE データベース名
    declare @password sysname
    set @password = 'XXXXX'  -- パブリッシャ側の sa のパスワード

    declare @enc_password nvarchar(524)
    set @enc_password = @password
    EXEC master.dbo.xp_repl_encrypt @enc_password OUTPUT
    --SELECT @enc_password   --暗号化されたパスワード

    UPDATE MSsubscription_properties
     SET publisher_security_mode=0
        ,publisher_login='sa'
        ,publisher_password=@enc_password
     WHERE
          publisher = 'パブリッシャ名'
      AND publisher_db = 'パブリッシュ対象の DB 名'
      AND publication = 'パブリケーション名'

    --確認
    SELECT * FROM MSsubscription_properties

    sp_link_publication がやっていることは、MSsubscription_properties の更新だけ
    なので、直接更新してもぜんぜん問題ないでしょう。うーーむ、面倒ですね ^^;

    sp_link_publication がうまく動かないのは私の環境だけだったりして.... orz

    2006年3月8日 20:24

すべての返信

  • 松本です。こんにちは

    私も以前試したときに sp_link_publication がうまく動かなかった記憶が
    あったので、改めて以下のように試してみました。

    EXEC sp_link_publication @publisher = 'PEPPER\SQL2K' --パブリッシャ名
        , @publisher_db =  'North2' --パブリッシュ対象の DB 名
        , @publication = 'North2'   --パブリケーション名
        , @security_mode = 0        --認証方法を SQL Server 認証に
        , @login = 'sa'             --ログイン名
        , @password = 'XXXXX'       -- sa のパスワード

    US のニュースグループだと、これでうまくいくよ、みたいな結論になっている
    のが多いのですが、私が試した限りでは、うまくいきませんでした ^^;

    なので、sp_helptext で sp_link_publication の中身を見ると...

    sp_helptext 'sp_link_publication'

      :
    EXEC @retcode = master.dbo.xp_repl_encrypt @enc_password OUTPUT
      :
    update MSsubscription_properties
    set
    publisher_login = @login,
    publisher_password = @enc_password,
    publisher_security_mode = @security_mode,
    distributor = isnull(@distributor, distributor)
    where UPPER(publisher) = UPPER(@publisher)
    and publisher_db = @publisher_db
    and publication = @publication

    となっていたので、即時更新の認証がらみの設定は、
    サブスクライバ側の MSsubscription_properties テーブルであることが
    分かります。クエリアナライザでサブスクライバへ接続して

    USE データベース名
    SELECT * FROM MSsubscription_properties

    とすると中身を確認できます。
    sp_link_publication 実行後も publisher_password が空であることから、
    sp_link_publication が失敗していることを確認できます。

    ■ 回避策は MSsubscription_properties を直接更新??
    なので、強引に、このテーブルを UPDATE ステートメントで直接更新したら、
    うまくログインできて即時更新できるようになりました。

    サブスクライバへ接続して、

    USE データベース名
    declare @password sysname
    set @password = 'XXXXX'  -- パブリッシャ側の sa のパスワード

    declare @enc_password nvarchar(524)
    set @enc_password = @password
    EXEC master.dbo.xp_repl_encrypt @enc_password OUTPUT
    --SELECT @enc_password   --暗号化されたパスワード

    UPDATE MSsubscription_properties
     SET publisher_security_mode=0
        ,publisher_login='sa'
        ,publisher_password=@enc_password
     WHERE
          publisher = 'パブリッシャ名'
      AND publisher_db = 'パブリッシュ対象の DB 名'
      AND publication = 'パブリケーション名'

    --確認
    SELECT * FROM MSsubscription_properties

    sp_link_publication がやっていることは、MSsubscription_properties の更新だけ
    なので、直接更新してもぜんぜん問題ないでしょう。うーーむ、面倒ですね ^^;

    sp_link_publication がうまく動かないのは私の環境だけだったりして.... orz

    2006年3月8日 20:24
  • ご返信、丁寧なご回答をいただきありがとうございました。

    松本様にご指摘頂いた通り、MSsubscription_propertiesのpublisher_password が空であることから、更新がうまくできないようです。

    当方も同じようなプログラムを作成して実行したところ、
    うまくログインできて即時更新できるようになりました。

    sp_link_publication がうまく動かないのは私の環境も同じです。。。

    2006年3月9日 5:58