mesaou
Goto Top

Fehler beim Ausführen eines MSSQL-Triggers mit EXECUTE AS User

Hi,

ich bräuchte mal wieder euren Support. Ich habe den Fall, dass ich einen SQL-Trigger gebaut habe der beim Update 2 Werte in eine andere Tabelle schreiben soll. Die zweite Tabelle liegt in einer anderen Datenbank mit unterschiedlichen Benutzern. Ich habe nun das Problem, dass der Trigger einen Fehler generiert wenn er von einem Benutzer ausgelöst wird, der keine Rechte in der Ziel-Tabelle hat (was ja auch irgendwo Sinn macht).
Ich würde ungern allen Benutzern aus Datenbank 1 Schreibrechte auf Datenbank 2 geben, deshalb habe ich etwas gesucht und bin dabei auf "Execute as" gestoßen. Das klingt an sich genau nach dem was ich brauche. Wenn ich das "Execute as" in den Trigger einbaue und den Trigger dann auslöse, bekomme ich die gleiche Fehlermeldung "Der Serverprinzipal <XXX> kann unter dem aktuellen Sicherheitskontext nicht auf die <YYY>-Datenbank zugreifen", nur dass <XXX> jetzt der mit "Execute as" ausgewählte Benutzer anstelle des aufrufenden Benutzers ist.

ALTER TRIGGER [dbo].[Update<Tabelle1>]
   ON  [dbo].[<Tabelle1>]
   with execute as <XXX>
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	
	iF EXISTS(Select k.Adresse from <Tabelle2> k, inserted i where k.Adresse = i.Adresse and k.Mandant = i.Mandant)
		Insert <YYY>.dbo.<Ziel-Tabelle>  (Feld0Wert,Feld1Wert) Select i.Adresse, i.Mandant from inserted i;
	END

Der Benutzer <XXX> hat Berechtigungen sowohl in der Quell-Datenbank als auch in der Ziel-Datenbank.

Ich habe schon probiert das Impersonate Recht zu setzen was nicht geholfen hat. Ich habe auch gelesen, dass das Prinzipal in Sys. database_principals oder Sys. server_principals angelegt sein muss, <XXX> ist in beiden vorhanden.

Sieht jemand den Fehler in meinem Trigger?

Grüße,
Mesaou

Content-ID: 332095

Url: https://administrator.de/contentid/332095

Ausgedruckt am: 24.11.2024 um 07:11 Uhr

Mesaou
Mesaou 15.03.2017 um 10:01:53 Uhr
Goto Top
Selbstgelöste Probleme sind doch die besten ^^
Mein Fehler war, dass das einfach Execute as nur innerhalb einer Datenbank funktioniert.
Gibt man dem Benutzer mit wenigen Rechten das Impersonate-Recht für den Benutzer der Berechtigungen für die Ziel-Tabelle und schreibt den Trigger dann folgendermaßen um funktioniert er wie erwartet. Man muss sich nur darüber im Klaren sein was das Impersonate-Recht bedeutet. Da dies, soweit ich es verstanden habe, dem Inhaber des Impersonate-Rechts die Möglichkeit gibt sich prinzipiell überall für den Benutzer auszugeben.

ALTER TRIGGER [dbo].[Update<Tabelle1>]
   ON  [dbo].[<Tabelle1>]
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	
	iF EXISTS(Select k.Adresse from <Tabelle2> k, inserted i where k.Adresse = i.Adresse and k.Mandant = i.Mandant)
	    execute as Login ='<Benutzer mit Rechten auf Ziel-Datenbank>'  
		Insert <Ziel_Datenbank>.dbo.<Ziel-Tabelle> (Feld0Wert,Feld1Wert) Select i.Adresse, i.Mandant from inserted i;
	END