MSDE FunClub
Microsoft Data Engine FunClub
MSDE初心者向けメーリングリスト過去ログ[1665]番
 
[TOP]>[MSDE初心者向けメーリングリスト過去ログ(1665番)]>[ウィンドを閉じる]
 
SQLServer2005時代でも
開発の基本は T-SQL
上巻で T-SQL の基礎作り
 
SQLServer2005時代でも
運用の基本はバックアップ
下巻でバックアップ手法を学びましょう
PASSJ人気コンテンツで学んだ後は下巻でさらなる学習を!
 
ウィンドを閉じる
MSDE/SQLServer FAQ
MSDE / MSDE2000 
技術情報サポート
初心者向け
メーリングリスト
過去ログの表示
技術者向け
メーリングリスト
過去ログの表示
メーリングリスト
活動状況の
表示
MSDE TOP メニュー
MSDEトップメニューに移動します
 

 
孤立ユーザの解決方法 ( RE:  MSDE と MSDE2000 の互換性について)

Date: Fri, 30 Sep 2005 22:20:12 +0900
From: "Akira Horikawa" <who@example.ne.jp>


堀川です、今晩は


-----Original Message-----
From: who@example.or.jp [mailto:who@example.or.jp]
Sent: Friday, September 30, 2005 7:58 PM
To: who@example.ne.jp
Subject: [ml-msde-beg:01664] MSDE と MSDE2000 の互換性について


>MSDE1.0でデータベースを作成し、Access2000のプロジェクトでアプリを作って
>いましたが、以前お伺いしたところ連鎖削除をするにはこの環境ではだめとの事
>でした。

はい、SQLServer7.0(MSDE)のデータベースエンジンの仕様で、
連鎖更新削除は、提供されません。


>そこで、MSDE2000とAccessXPをインストールしたところ、ダイアグラムには連鎖
>削除のチェックボックスが表示されるようになったのですが、MSDE1.0で作成し
>たデータベースを新しい環境に移動し、プロジェクトから接続してもエラーでデ
>ーターベースに接続できません。

ログイン情報は、どのようになっていますか?
また、ログイン名とデータベースユーザの対応は、合っているでしょうか?

    OSQL  -U ログイン名  -P パスワード  -Sサーバー名

で、ログインが成功したら、

              USE  目的のデータベース名
            GO

で、目的のデータベースが使えるかどうか確認してみて下さい。

もし、ログイン情報とデータベースユーザ名の対応が合っているのに、その
データベースが使えない場合は、SID番号の不一致が考えられます。


    データベースサーバー(A)

で、新しいSQLServerログイン名LOG-Aを作成したとします。

         sp_addlogin  'LOG-A'  ,  'パスワード'

また、データベースサーバー(A)上で、データベースTestに、LOG-Aログインに
対応するデータベースユーザUSER-Aを作成したとします。

このとき、「ログインの名前(LOG-A)」と「データベースユーザの名前(USER-A)」の
対応が作成されましたが、実際は、「ログインの名前」ではなく、「ログインの名
前」
に対応した「セキュリティID番号(SID)」が、内部的には採用されます。
SID値は、 SELECT SUSER_SID('LOG-A') で表示されます。

つまりデータベースユーザ名に対応しているのは、「ログインの名前」ではなく
「ログインのSID番号」が対応していると考えて下さい。


 次に、データベースサーバー(B)で、ログインLOG-Aを作成します。
このとき、SID値を指定せずに、
        sp_addlogin  'LOG-A'  ,  'パスワード'
で作成すると、システムがSID値を適当に作ります。
当然、データベースサーバー(A)上のSID値とは異なる値で作成されたと思います。

一方、初めから、データベースサーバー(A)のデータベースを移行する目的が
わかっていれば、ログインを作成するときに、SID値を指定して、ログインを
作成することができます。
      sp_addlogin  @loginame = 'LOG-A' ,
                                @passwd =  'パスワード',
                                @sid = 'サーバーAと同じSID値'


データベースTestを、データベースサーバー(A)から(B)に持ってきたときに、
ログイン名Log-AのSID値が一致していないと、データベースユーザUSER-Aは、
その対応関係を失ってしまいます(孤立ユーザの発生)。


孤立ユーザを解消させる方法は、移行したデータベースの内部に登録された
              SID値 と データベースユーザ名
の対応関係(sysusersテーブル)を、正常なものに、強制的に書き換えます。



まず、データベースサーバー(B)側で、Testデータベースに孤立ユーザが
存在すると仮定します。

孤立ユーザが存在するかどうかは、saなどのシステム管理者でログイン
して、次のSQL文を実行して下さい

select master.dbo.sysxlogins.sid  AS master_sid,
         Test.dbo.sysusers.sid        AS DB_sid ,
         Test.dbo.sysusers.name    AS DB_user
  from master.dbo.sysxlogins
    right outer join Test.dbo.sysusers
      ON master.dbo.sysxlogins.sid = Test.dbo.sysusers.sid
  where(
         Test.dbo.sysusers.sid IS NOT NULL
    AND
         master.dbo.sysxlogins.sid  IS NULL
  )

レコードが表示されたら、そのユーザ名に対応するSID値が、
データベースサーバー側に存在しないことがわかります

上記を実行し、データベースユーザUSER-Aが孤立しているとします。
また、USER-Aとログイン名LOG-Aが対応しなければいけないとします。


現在の、LOG-AログインユーザのSID値を調べます。

select  master.dbo.sysxlogins.sid
     from master.dbo.sysxlogins
          where name = 'LOG-A'

上記で得られたSID値を、データベースのsysusersの中に書き込みます。

    exec sp_configure  'allow updates' , 1
    reconfigure  with  override
を実行し、システムテーブルを直接書き換えができるように宣言します。


update  Test.dbo.sysusers
  set  sid = 0x16進数文字列--(SID値)--
where
    name = 'USER-A'

を実行して、データベース側のsysusersテーブル内に格納されている
SID値を、強制的に書き換えます。

    exec sp_configure  'allow updates' , 0
    reconfigure with override
で、システムテーブルの直接書き換えを禁止します。

以上の操作によって、データベースサーバー(B)側の、
Testデータベースの孤立ユーザが、ログイン名と正しく
対応するようになります。

上記の操作をすれば、データベースが使えるようになるでしょう。

一般的に、データベースサーバー間で、データベースを移動したり
するときは、ログイン情報のSID値を一致させなければいけません。
これは、データベースをバックアップして、別のサーバーで復元する
場合も同様です。

なおまったく同じ環境のデータベースサーバーであれば、master
データベースをバックアップして、復元すれば、ログイン情報等が
同一になります。


------------------------------------
Epata-IT/日本技術ソフト開発
        堀川 明  (Akira Horikawa)
    09月30日(金曜日) 22時16分記
        mailto:who@example.ne.jp
        http://www.horikawa.ne.jp/msde/











[MSDE/SQLServerに関して、今、どんなことにお困りですか?]
よろしければお困りの内容を、電子メールで教えて下さい。
質問を電子メールで作成する


[ウィンドを閉じる]

[MSDE/SQLServer FAQ ]

[MSDE / MSDE2000 技術サポート情報一覧]

MSDE TOP ページに移動する

 
 
 
 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDEを始めとする各種データベースシステムの開発、コンサルタントに関するご要望等は、
msdedev@horikawa.ne.jp までご連絡下さい。