Impressum  |   RSS  |  Registrieren

tsql

Transact SQL – CREATE TRIGGER

Für die Erstellung eines DML Triggers wird die ALTER Berechtigung für die Tabelle oder Sicht vorausgesetzt.
Zum Erstellen eines DDL Triggers mit Serverbereich, ist die CONTROL SERVER Berechtigung erforderlich. Für DDL-Trigger mit Datenbankbereich, wird die ALTER ANY DATABASE DDL TRIGGER Berechtigung der Datenbank benötigt. In den Nachfolgenden Beispielen verwende ich die AdventureWorks Datenbank.
 
Beispiel für die Verwendung eines Triggers. Der Trigger wird bei Löschvorgängen in der DatabaseLog Tabelle ausgelöst. Die DatabaseLogID des gelöschten Eintrages wird per E-Mail an den Administrator gesendet.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
USE AdventureWorks
GO
CREATE TRIGGER SPION1
ON dbo.DatabaseLog
AFTER DELETE 
 
AS
DECLARE @LogID INT;
SELECT @LogID =(SELECT DatabaseLogID FROM DELETED);
 
 
   EXEC msdb.dbo.sp_send_dbmail
        @recipients = 'administrator@tsql.de',
        @body = 'Ein Logeintrag wurde gelöscht.',
        @subject = @LogID;
GO
 
 
 
/*
Erklärung
---------
 
CREATE TRIGGER SPION1
ON dbo.DatabaseLog
 - Ein neuer Trigger "Spion1"
   wird an die Tabelle DatabaseLog angefügt
 
AFTER DELETE             
 - Der Trigger wird nach der DELETE Anweisung ausgeführt. 
 - Wenn die Anweisung vor der Beendigung abbricht,
   wird der Trigger nicht ausgeführt. 
 
SELECT DatabaseLogID FROM DELETED
 - Dient zum Empfangen von Werten aus der DELETE-Anweisung.
 - Für UPDATE-Anweisungen nimmt man UPDATED und INSERTED für INSERT-Anweisungen
 
*/

 
Wenn jetzt ein Eintrag aus der Datenbank gelöscht wird, bekommt der Admin eine E-Mail Benachrichtigung.
 

1
2
DELETE FROM [AdventureWorks].[dbo].[DatabaseLog]
      WHERE DatabaseLogID='25'

 
 

Beispiel für einen Trigger der auf INSERT reagiert.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
USE AdventureWorks
GO
 
CREATE TRIGGER InsertTrigger
 
ON dbo.DatabaseLog
AFTER INSERT 
AS
DECLARE @DatabaseUser VARCHAR(128);
 
SELECT @DatabaseUser =(SELECT DatabaseUser FROM INSERTED);
 PRINT 'Der Benutzer ' +  @DatabaseUser + ' hat einen Fehler produziert.';
GO