문제

안녕하세요 저는 사용자에게 Select Privs를 거부 한 테이블이 있습니다.
이 테이블은 기본적으로 삽입 된 테이블을 참조하는 트리거가 있습니다.

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

그래도 "선택 거부"라고 말하는 오류가 주어지고 있습니다.

Select Deny를 유지하려면 어떻게하지만 트리거가 삽입 된 가문관에서 선택하도록 허용합니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

추가를 고려하십시오 AS를 실행하십시오 조항 스키마 소유자의 권한과 함께 트리거가 실행됩니다.

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

다른 팁

선택을 거부 한 이유는 무엇입니까? 그들에게 선택을 부여하지 않는 것은 어떻습니까? 선택을 거부하는 것과 그들에게 부여하지 않는 것에는 미묘한 차이가 있습니다. 또한 시스템 수준 역할을 선택하지 않으면 문제의 일부일 것입니다.

--편집하다--

의견에서 SQL Server에 컨텍스트 정보가 있는지 여부를 물었습니다. 2005는 그것을 사용하는 방법을 볼 수 있습니다. 여기.

세션 변수 - Context_Info : 세션은 모든 프로그래밍 언어의 강력한 도구입니다. SQL-Server는 완전한 Fledge 프로그래밍 언어가 아니지만 현재 세션 또는 연결의 세션 변수를 지원합니다. 이진 정보의 128 바이트에 세션 가치를 저장합니다.

다음과 같은 것 대신 삽입 된 테이블에 가입하십시오.

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

이것은 어쨌든 하위 선택보다 더 나은 결과를 얻을 수 있습니다.

귀하의 문제는 업데이트 문 자체에 선택 권한이 필요하다는 것입니다.

다음과 같이 테스트 데이터베이스를 만들었습니다.

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

'테스터'로그인으로 다음 업데이트 문을 사용해 보았습니다.

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

첫 번째는 정상을 실행하고 트리거가 실행됩니다 (Select *의 결과를 선택한 권한없이 Triggertable에서 사용자에게 제공하여 SELECT를 수행 할 수 있음을 보여줍니다).

두 번째는 TrigGertable에 대한 선택 권한이 없다는 오류를 제공합니다 (ID의 값을 업데이트 할 수 있도록 TrigGertable에서 선택해야하기 때문에).

이로 인해 트리거가 문제에 부수적이라고 결론을 내립니다. 업데이트 문은 권한 문제의 원인입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top