Access2007とADPとSQLServer

3日連チャンで同じような事を書いていますが、今日が最後。

 

Access2007のADPで使えるSQLServerのバージョンはどれか。

 

2005なら確実に動く。

2008と2008R2は接続はできるけど、ビューなどのSQLServerオブジェクトの保存ができない。

 

ということで、MSDE2000からSQLServer2005に変更して、Access2007のADPで接続テストしたところ、見事にハマリました。

 

動かしてみると、テーブルがないとか言われます。

う~ん、あるんだけどなぁと思っていたのですが、よ~~~~くみてみると、何か変だ。

テーブル名(dbo)、ストアド名(dbo)と書いてある。

これか?

(dbo)という、余計な修飾が入っているらしく、元のテーブルと同じように認識してくれません。

 

この手の情報は日本語では、殆ど出てこないので英語で検索。

The dbo is the database owner and if you are in the administrators group of the DBO group for the database then you can leave it off.

ということで、ロールをごにょごにょしたりすると  (dbo)がなくなりました。

まぁ、いろいろとあるんですなぁ移行は。

 

ここからは余談というかなんというか、DBを移行したときの話なんですが、元のSQLServerを停止してmdf、ldfファイルをコピーしてアタッチしたらエラーが出ました。

 

なので、完全バックアップをして、「データベースの復元」で元に戻します。

復元先はSSMSでサーバーのプロパティのデータベースの設定メニューの中にある「データベースの既定の場所」を変更すれば、そこにファイルができます。 コマンドでもファイルの場所は指定できたかな?

 

次に、孤立ユーザーがいるはずなので、これを解消します。

google先生で”SQLServer 孤立ユーザー”で検索すれば解決方法はいくつも出てきますが、今回の場合MSDE2000からSQLServer2005の移行で、まだユーザーを作成していなかったので、MSDE2000でここにあるSQLを実行。

”SQL Server のインスタンス間でログインおよびパスワードを転送する方法”

http://support.microsoft.com/kb/246133/ja

 

出てきたSQLの中で必要なユーザーの分だけ抜き出して、SQLServer2005で実行。

これで必要なユーザーができます。

 

最後に戻したDBのオブジェクトに権限を付ける作業ですが、手作業だと大変なので、

SELECT  'GRANT ALTER ON [dbo].[‘ + name + ‘] to ユーザー名 ' from sys.objects where type='P' and iS_ms_shipped='0'

なんてSQLを作って、出力結果から権限を付けるスクリプトを作っちゃいます。

 

sys.objectsからSQLServerのオブジェクトを抽出する場合、typeでテーブルとかビューなどを指定します。

この辺はgoogleで検索した方がわかりやすいです。(と他人任せ)