2009-05-07 6 views
0

私はSQL Server 2000のテーブルを持っているとしましょう、どのような名前でも、このトピックとは無関係です。この表には、更新または挿入後に実行されるトリガーがあります。トリガを強制的にSQL Server 2000のユーザーとは別のコンテキストで実行できますか?

ユーザーは、トリガーが接続されている表を挿入および更新できますが、トリガーがターゲットとする他の表には挿入できません。

元のテーブルのデータをユーザーが変更すると、そのユーザーにトリガーのターゲットテーブルのデータを変更する権限がないという例外が発生します。

これは、トリガーがユーザーのコンテキストで実行されていることが原因であると想定します。トリガを独自のコンテキストで実行させる方法はありますか、またはこの例外の原因を正しく解釈していませんか?

編集:私はSQL Server 2000を使用しているので、EXECUTE ASを使用すると機能しないことを指摘します。

答えて

0

トリガーは通常、最初の変更を行ったユーザーの権限で動作します。このようなものを回避するには、トリガーがデータを一時テーブルに書き込んだり、別のプロセス(上位レベルのユーザーとしてログイン)を作成して一時テーブル内のデータを頻繁にチェックし、それをターゲットに移動させる表。

+0

ええ、大丈夫です、それはうまくいくと思います。だから別のプロセスがスケジュールされた仕事でなければならないと思う。私が探していたものではありません。 – BenAlabaster

3

MSDN resource

トリガが を実行される下、セキュリティ コンテキストを指定として実行されます。 ユーザーアカウントにSQL のインスタンスを使用して、 のアクセス許可を検証するときに使用するデータベースオブジェクト( )を制御できます。

+0

ありがとう、私はすでに前にこの文書を見てきましたが、私はWITH EXECUTE AS機能を見逃してしまったと思います。注意点:ddartドキュメントにはこの情報も含まれていません。 http://doc.ddart.net/mssql/sql70/create_8.htm – BenAlabaster

+0

また、これはSQL Server 2005のみです。 – BenAlabaster

0

どのバージョンのSQL Serverを使用していますか?私は、SQL Server 2005で何の問題もなくそれを行うことだけができた:

CREATE TABLE dbo.Test_Trigger_1 
(
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Trigger_1 PRIMARY KEY CLUSTERED (my_string) 
) 
GO 

CREATE TABLE dbo.Test_Trigger_2 
(
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Trigger_2 PRIMARY KEY CLUSTERED (my_string) 
) 
GO 
CREATE TRIGGER dbo.tri_Test_Trigger_1 
ON dbo.Test_Trigger_1 
FOR INSERT 
AS 
BEGIN 
    INSERT INTO dbo.Test_Trigger_2 
    (
     my_string 
    ) 
    SELECT 
     my_string 
    FROM 
     INSERTED 
END 
GO 

その後、私は、私はそれがTest_Trigger_2にアクセスできなかったことを確認しただけTest_Trigger_1へのアクセスを持っていたログインを作成し、私はTest_Trigger_1に行を挿入しましたTest_Trigger_2に行が表示されました。

+0

トリガーは、実際にはユーザーがアクセス権を持っていない別のデータベースに渡っています。私はこれが問題を引き起こしている可能性が高いと思う。これは、同じデータベース内で少なくとも動作するはずであるという事実を強調しているので、参考になります。 – BenAlabaster

+0

ああ、その場合は、EXECUTE ASがそのトリックを行うべきですが、私はそれをテストしていません。 –

関連する問題