Можно ли принудительно запустить триггер в отдельном контексте, чем пользователь в SQL Server 2000? - PullRequest
0 голосов
/ 07 мая 2009

Допустим, у меня есть таблица SQL Server 2000, подойдет любое имя, оно не имеет отношения к этой теме. В этой таблице у меня есть триггер, который запускается после обновления или вставки.

Пользователь может вставлять и обновлять таблицу, к которой прикреплен триггер, но не в других таблицах, для которых предназначен триггер.

Если пользователь изменяет данные в исходной таблице, я получаю исключение, сообщающее, что у пользователя нет разрешения на изменение данных в целевых таблицах триггера.

Я полагаю, это связано с тем, что триггер работает в контексте пользователя. Есть ли способ запустить триггер в своем собственном контексте или я неправильно интерпретирую причину этого исключения?

Редактировать: Следует отметить, что я использую SQL Server 2000, поэтому использование EXECUTE AS не будет работать.

Ответы [ 3 ]

3 голосов
/ 07 мая 2009

ресурс MSDN

EXECUTE AS Определяет безопасность контекст, в котором триггер казнены. Позволяет вам контролировать, какие учетная запись пользователя экземпляр SQL Сервер использует для проверки разрешений на любые объекты базы данных, которые на который ссылается триггер.

0 голосов
/ 07 мая 2009

Какую версию 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_1, я подтвердил, что он не может получить доступ к Test_Trigger_2, вставил строку в Test_Trigger_1, и строка появилась в Test_Trigger_2.

0 голосов
/ 07 мая 2009

Триггеры обычно работают с разрешениями пользователя, который внес первоначальное изменение. Обходной путь для чего-то подобного заключается в том, что триггер записывает данные во временную таблицу, а затем выполняет отдельный процесс (вошел в систему как пользователь более высокого уровня), который периодически проверяет данные во временной таблице и перемещает их в целевой объект. стол.

...