2009-05-07 4 views
0

Nehmen wir an, ich habe eine SQL Server 2000-Tabelle, jeder Name wird es tun, es ist für dieses Thema irrelevant. Auf dieser Tabelle habe ich einen Trigger, der nach dem Update oder Einfügen läuft.Kann ein Trigger in einem anderen Kontext als der Benutzer in SQL Server 2000 ausgeführt werden?

Der Benutzer kann die Tabelle einfügen und aktualisieren, an der der Trigger angehängt ist, jedoch nicht für andere Tabellen, auf die der Trigger abzielt.

Wenn der Benutzer Daten in der ursprünglichen Tabelle ändert, erhalte ich eine Ausnahme, die beschwert, dass der Benutzer nicht berechtigt ist, Daten in den Zieltabellen des Triggers zu ändern.

Ich nehme an, dass dies durch die Tatsache verursacht wird, dass der Auslöser im Kontext des Benutzers ausgeführt wird. Gibt es eine Möglichkeit, den Trigger in seinem eigenen Kontext laufen zu lassen oder interpretiere ich die Ursache dieser Ausnahme nicht richtig?

Edit: Ich sollte darauf hinweisen, dass ich SQL Server 2000 verwende, so dass die Verwendung von EXECUTE AS nicht funktioniert.

Antwort

0

Auslöser funktionieren normalerweise mit den Berechtigungen des Benutzers, der die anfängliche Änderung vorgenommen hat. Eine Problemumgehung für etwas Ähnliches besteht darin, dass der Trigger die Daten in eine temporäre Tabelle schreibt und dann einen separaten Prozess (als übergeordneter Benutzer angemeldet) regelmäßig nach Daten in der temporären Tabelle sucht und in das Ziel verschiebt Tabelle.

+0

Hmm, okay, ich denke, das würde funktionieren. Also muss der separate Prozess ein geplanter Job sein, denke ich. Nicht wirklich wonach ich gesucht habe. – BenAlabaster

3

MSDN resource

EXECUTE AS die Sicherheit Kontext, unter dem Legt die Trigger- ausgeführt ist. Hiermit können Sie steuern, welches Benutzerkonto die Instanz von SQL Server verwendet, um Berechtigungen für alle Datenbankobjekte zu überprüfen, die sind, auf die der Trigger verweist.

+0

Danke, ich bin schon auf dieses Dokument gestoßen, ich denke, ich habe die WITH EXECUTE AS-Funktion verpasst. Punkt: Das ddart-Dokument enthält diese Information nicht einmal. http://doc.ddart.net/mssql/sql70/create_8.htm – BenAlabaster

+0

Außerdem bemerke ich, dass dies nur SQL Server 2005 ist. – BenAlabaster

0

Welche Version von SQL Server verwenden Sie? Ich war nur in der Lage es ohne Probleme in SQL Server zu tun, 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 

Dann habe ich ein Login, die nur Zugang zu Test_Trigger_1 hatte, habe ich bestätigt, dass es nicht Test_Trigger_2 zugreifen kann, eingefügt ich eine Zeile in Test_Trigger_1 und eine Zeile erschien in Test_Trigger_2.

+0

Der Auslöser ist tatsächlich in eine andere Datenbank ausstreuen, dass der Benutzer nicht einmal die Berechtigung zum Zugriff hat . Ich denke, das ist wahrscheinlich, was das Problem verursacht. Dies ist jedoch hilfreich, da es die Tatsache hervorhebt, dass es zumindest in der gleichen Datenbank funktionieren sollte. – BenAlabaster

+0

Ahh ja, dann sollte das EXECUTE AS den Trick machen, obwohl ich es nicht getestet habe. –

Verwandte Themen