AccessからSqlServerのストアドを実行してストアドの戻り値からも
ココに注意
正常終了しているにも関わらず計算が実行されていない
という問題にぶち当たり原因を追究する前に時間を要しました。
散々、Access側のVBAやら、ストアドのコードをいじくりまわし確認しましたが、原因は全く別な事で接続ユーザーの権限でした。
データベースを複製したのが原因??
今回は、同じ仕組みを使うために、1つの元になるデータベース(motoDB)マスター情報などを集約したデータベースと、作業処理をするデータベース(jobDB)を、複製したデータベース(copyjobDB)というのを準備したとします。
copyjobDBを動かす為に、SQLserverへの接続ユーザーuserというのを追加しました。
userを追加する時に、ユーザーマッピングにて、データベースcopyjobDBにチェックをいれて権限を設定しました。
また、
motoDBのリンクテーブルを使う部分があったのですが、motoDBを動かせる権限の接続ユーザーを設定しておりレコードも確認できてました。
この状態でストアド実行すると、特にエラーの戻り値も無いまま正常終了しました。
しかし、実際にテーブルを見てみると、更新されていません。
つまり、エラーは出ないけど計算されてないのです。
原因は接続ユーザーの権限
motoDBのリンクテーブルにて、何の問題なく見えていたので新たな接続ユーザーの方まで気が回りませんでした。
ココがポイント
原因は、接続ユーザーのアクセス権限だったようです!
リンクテーブルで正常接続されているからと言っても、SqlServerの方で権限を設定しないとダメだったのです。
無駄な時間の原因
MSSMSにて、Sqlserverの方で、クエリにて「EXEC ストアド名;」にて手動実行すると正常にストアドが動いて計算されていたので、この考えに至るまでに時間を要してしまいました。
具体的なユーザーマッピング設定
motoDBをユーザーマッピングにて、マップにチェックいれて、更に、db_ownerにチェックをいれました。
※db_ownerにチェックしないとテーブルが見えなかったりします。
このように、motoDBも操作できる権限を持つことで、motoDBのテーブルも初めてストアドから計算して更新されるという事をしりました。
Accessでストアド実行していると、なにも問題なく終了してしまうので、このような権限の問題に気づかずにどこにバグがあるんだろうなんて時間の浪費をしてしまう可能性がありますので注意が必要ですね。