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 技術サポート情報一覧]
|