質問

こんにちは。ユーザーに対する SELECT 権限を拒否したテーブルがあります。
このテーブルには、INSERTED テーブルを参照するトリガーがあり、基本的に

AFTER UPDATE SET <table>.[UPDATED] = getdate() 
  WHERE ROWID IN SELECT ROWID FROM INSERTED

ただし、「SELECT PERMISSIONS DENIED」というエラーが表示されます。これは、SELECT FROM INSERTED が原因であると推測されます。

SELECT 拒否を維持し、トリガーによる INSERTED 疑似テーブルからの SELECT を許可するにはどうすればよいですか?

前もって感謝します!

役に立ちましたか?

解決

トリガーがスキーマ所有者の権限で実行されるように、 EXECUTE AS 句を追加することを検討してください。

CREATE TRIGGER [dbo].[TR_Product_Update] ON [Product]
   WITH EXECUTE AS OWNER
   AFTER UPDATE
AS
SELECT ProductId
FROM INSERTED

他のヒント

なぜ選択を拒否したのですか?単に選択を許可しないのはどうですか?選択を拒否することと、許可しないこととの間には微妙な違いがあります。また、システムレベルの役割のいずれかに対する選択を拒否した場合、それもおそらく問題の一部になります。

-編集-

コメントで、SQL Serverにコンテキスト情報があるかどうかを尋ねました。 2005はそうであり、その使用方法はこちら

  

セッション変数&#8211; Context_Info:Sessionは、あらゆるプログラミング言語の強力なツールです。 SQL-Serverは完全なプログラミング言語ではありませんが、現在のセッションまたは接続のセッション変数をサポートしています。セッションの値を128バイトのバイナリ情報に保存します。

代わりに挿入されたテーブルに参加します:

update t1
set updated = getdate()
from table1 t1
join inserted i
on i.rowid = t1.rowid

これはおそらく、副選択よりもパフォーマンスが高いでしょう。

あなたの問題は、UPDATE ステートメント自体に SELECT 権限が必要であることだと思います。

次のようにテストデータベースを作成しました。

DROP DATABASE triggerPermissionTest
CREATE DATABASE triggerPermissionTest
GO
USE triggerPermissionTest
GO
CREATE USER foo FROM LOGIN tester
GO
CREATE TABLE triggerTable (id int)
GO
DENY SELECT ON triggerTable to foo
GRANT UPDATE ON triggerTable to foo
GO
CREATE TRIGGER execAsTrigger ON triggerTable
AFTER UPDATE AS SELECT * FROM triggerTable
GO
INSERT INTO triggerTable VALUES (1)
GO

そして、「tester」ログインで次の Update ステートメントを試しました。

UPDATE triggerTable SET id = 2
GO
UPDATE triggerTable SET id = id *2
GO

最初のものは正常に実行され、トリガーが実行されます (選択権限のないユーザーに select * fromtriggerTable の結果が提供され、選択が実行されたことが示されます)。

2 つ目では、triggerTable に対する選択権限がないことを示すエラーが表示されます (更新を行うために id の値を取得するには、triggerTable から選択する必要があるため)。

このことから、トリガーは問題に付随しており、UPDATE ステートメントがアクセス許可の問題の原因であると結論付けられます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top