質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

1回答

3991閲覧

SQLServer 2008で実行ユーザーを指定してプロシージャを実行するとエラーになる。

kometaroimo

総合スコア76

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2017/02/23 04:03

<質問内容>
SQLServer 2008についてです。

<要件と現在の状況>
SQLServer
DB1 mst_table_1
DB2 mst_table_1
ユーザーはデフォルトのsaと自分で作成したprocuserのみ
上記シチュエーションでDB1.mst_table_1を主として、DB2.mst_table_1に同期を取りたいです。

<やった事1>

[sql] truncate table [DB2].[dbo].mst_table_1 INSERT INTO [DB2].[dbo].mst_table_1 SELECT * FROM [DB1].[dbo].mst_table_1

これはうまくいきました。
次に、プロシージャ実装したくてプロシージャprc_programをDB2に作成しました。

<やった事2>

[prc_program] USE [DB2] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[dataMigration]() WITH EXECUTE AS 'procuser' AS BEGIN PRINT 'コメント1:BEGIN TRANSACTIONが始まるよ' BEGIN TRANSACTION PRINT 'コメント2:truncateが始まるよ' truncate table [DB2].[dbo].mst_table_2 PRINT 'コメント3:select insertが始まるよ' INSERT INTO [DB2].[dbo].mst_table_2 SELECT * FROM [DB1].[dbo].mst_table_1 PRINT 'コメント4:commitが始まるよ' COMMIT TRANSACTION END

これが動かないのです。。
saでログインして実行すると下記エラーが発生して実行できません。

エラー
現在のセキュリティ コンテキストでは、サーバー プリンシパル "procuser" はデータベース "DB1" にアクセスできません。

<調査>
PRINTの出力を確認すると、「PRINT 'コメント4:commitが始まるよ'」だけ出力されていない状態でした。
PRINTの結果から「insert into ...」が何かの原因でエラーとなっているのではと思い、以下に変えて再実行してみました。

前:INSERT INTO [DB2].[dbo].mst_table_2 SELECT * FROM [DB1].[dbo].mst_table_1
後:INSERT INTO [DB2].[dbo].mst_table_2 SELECT * FROM [DB1].[dbo].mst_table_2

結果、実行できました。

ここで質問です。
procuserでログインして
INSERT INTO [DB2].[dbo].mst_table_2 SELECT * FROM [DB1].[dbo].mst_table_1
を実行すると実行できるのに、なぜプロシージャの実行だとうまくいかないのか?

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

暫定対応になりますが、ひとまず実現はできましたので追記いたします。
procuserに対して、grantでDMLの権限を各オブジェクト(※1)に対して付与する事で解決しました。

※1 各データベースのmst_table_1、mst_table_2

ただ、標準で存在するロールを適用しているので、実際にprocuserでログインして各データベースの各オブジェクトに対しては、grantする前とやれることは変わっていないんですよねぇ。。
権限周りを体系的に学ばないと根本解決は難しそうなので、またクリアになったら追記します。

投稿2017/03/03 00:06

kometaroimo

総合スコア76

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問