2009-05-07 1 views
0

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

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

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

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

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

ответ

0

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

+0

Хм, хорошо, я думаю, что это сработает. Таким образом, отдельный процесс должен быть запланированным заданием, я думаю. Не совсем то, что я искал. – BenAlabaster

3

MSDN resource

EXECUTE AS Определяет безопасность контекст, в котором триггер выполняется. Позволяет вам управлять какой учетной записью экземпляр 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_1, я подтвердил, что он не мог получить доступ к Test_Trigger_2, я вставил строку в Test_Trigger_1 и строка появилась в Test_Trigger_2.

+0

Триггер фактически пересекает другую базу данных, в которой пользователь даже не имеет доступа к доступу , Я думаю, что это, вероятно, вызывает проблемы. Это полезно, хотя, поскольку это подчеркивает тот факт, что в той же самой базе данных, по крайней мере, она должна работать. – BenAlabaster

+0

Ahh да, тогда в этом случае EXECUTE AS должен сделать трюк, хотя я его не тестировал. –