Eine spezielle gespeicherte Prozedur, die automatisch ausgeführt wird, wenn ein Trigger etwas in eine Tabelle einfügt, aktualisiert oder löscht. Trigger werden im Allgemeinen für Einschränkungen mit komplexeren Prüfeinschränkungen verwendet. Der Unterschied zwischen Triggern und gewöhnlichen gespeicherten Prozeduren besteht darin, dass Trigger auf einer bestimmten Tabelle ausgeführt werden. Bei Vorgängen wie Aktualisieren, Einfügen und Löschen ruft das System automatisch den entsprechenden Trigger für die Tabelle auf und führt ihn aus. Trigger in SQL Server 2005 können in zwei Kategorien unterteilt werden: DML-Trigger und DDL-Trigger wirken sich auf eine Vielzahl von Anweisungen in der Datendefinitionssprache aus und werden ausgelöst.
Es gibt drei häufige Auslöser: Sie werden jeweils auf Einfügungs-, Aktualisierungs- und Löschereignisse angewendet.
Warum sollte ich Trigger verwenden? Zum Beispiel diese beiden Tabellen:
Tabelle Student( StudentID. int ' zu ' s ' s ' s ' s div' s Die Kreditzeit
...
)
1. Wenn ich die Schülernummer des Schülers ändere, ändere ich die Schüler. Ich hoffe, dass sein Ausleihdatensatz noch mit diesem Studenten in Zusammenhang steht (d. h., dass gleichzeitig die Studenten-ID der Ausleihdatensatztabelle geändert wird).
2. Wenn der Student seinen Abschluss gemacht hat, hoffe ich, seinen Studentenausweis zu löschen gleichzeitig auch die Entleihunterlagen löschen.
Warte.
Trigger können zu diesem Zeitpunkt verwendet werden. Erstellen Sie für 1 einen Update-Trigger:
Trigger erstellen truStudent
On Student – Erstellen Sie einen Trigger in der Student-Tabelle
für Update – Warum das Ereignis wird ausgelöst
StudentID=i festlegen. > Ende
Verstehen Sie die beiden temporären Tabellen im Trigger: Gelöscht und Eingefügt. Beachten Sie, dass „Gelöscht“ und „Eingefügt“ jeweils den „alten Datensatz“ und den „neuen Datensatz“ der Tabelle darstellen, die das Ereignis ausgelöst hat.
In einem Datenbank-Lernsystem gibt es zwei virtuelle Tabellen, die zum Speichern von Informationen verwendet werden, die Änderungen in der Tabelle aufzeichnen, nämlich:
neu Datensätze ohne Speicherdatensätze hinzugefügt
Wegwerfbare Datensätze, wenn sie gelöscht und gespeichert werden. Stellen Sie sich das so vor: Erstellen Sie neue Datensätze in der Tabelle „Eingefügt“, kopieren Sie die alten Datensätze in die Tabelle „Gelöscht“, löschen Sie dann den Datensatz „Student“ und schreiben Sie den neuen Datensatz.
Für 2 einen Löschtrigger erstellen
Trigger erstellen trdStudent
zum Löschen
Als BorrowRecord
aus BorrowRecord löschen br , Delted d
Wobei br.StudentID=d.StudentID
Anhand dieser beiden Beispiele können wir den Schlüssel zum Trigger erkennen: A. 2 temporäre Tabellen
Beim Aktualisieren von Daten löschen Sie zunächst den Tabellendatensatz und fügen dann einen Datensatz hinzu. Auf diese Weise werden in den eingefügten und gelöschten Tabellen aktualisierte Datensätze vorhanden sein. Beachten Sie, dass der Trigger selbst eine Transaktion ist, sodass einige spezielle Prüfungen für geänderte Daten im Trigger durchgeführt werden können. Wenn dies nicht der Fall ist, können Sie den Vorgang mithilfe des Transaktions-Rollbacks rückgängig machen.
Ø Trigger erstellen
Syntax Trigger erstellen tgr_nameauf Tabellenname
mit Verschlüsselung – Verschlüsselungstriggerfür Update...
alsTransact-SQL
#Einfügetyp-Trigger erstellen
--Einfüge-Einfügetyp-Trigger erstellen
if (object_id('tgr_classes_insert', 'tr') is not null)
Trigger tgr_classes_insert löschen
go
Trigger tgr_classes_insert erstellen
für Klassen
für insert --insert trigger
as
--define variables
deklarieren @id int, @name varchar(20), @temp int;
--query im eingefügten Tabellendatensatz Informationen wurden eingefügt
select @id = id, @name = name from insert;
set @name = @name + convert(varchar, @id);
set @temp = @id / 2;
in Schülerwerte einfügen(@name, 18 + @id, @temp, @id);
drucken 'Student erfolgreich hinzugefügt! ';
go
--Daten einfügen
in Klassenwerte einfügen('5Class', getDate());
--Daten abfragen
wähle * aus Klassen;
wähle * aus Schülerreihenfolge nach ID;
Der Einfügetrigger fügt der eingefügten Tabelle einen neu eingefügten Datensatz hinzu.
# Löschtyp-Trigger erstellen
--delete Löschtyp-Trigger
if (object_id('tgr_classes_delete', 'TR') is not null)
Trigger tgr_classes_delete
go
Trigger tgr_classes_delete
auf Klassen erstellen
zum Löschen --delete Trigger
as
print 'Daten sichern...'
if ( object_id('classesBackup', 'U') ist nicht null)
--classesBackup existiert, Daten direkt einfügen
in ClassesBackup einfügen Namen auswählen, Datum aus dem gelöschten erstellen;
sonst
--existiert nicht Erstellen Sie ein Klassen-Backup und fügen Sie dann
„select *“ in „classesBackup von gelöscht“ ein;
drucken Sie „Daten erfolgreich sichern!“ ';
go
--
--Zeige die Anzahl der betroffenen Zeilen nicht an
--set nocount on;
lösche Klassen, bei denen name = '5Class';
-- Daten abfragen
wählen Sie * aus Klassen;
wählen Sie * aus KlassenBackup;
Der Löschtrigger speichert beim Löschen von Daten die gerade gelöschten Daten in der gelöschten Tabelle.
# Update-Typ-Trigger erstellen
--Update-Update-Typ-Trigger
if (object_id('tgr_classes_update', 'TR') is not null)
Trigger tgr_classes_update löschen
gehen
Trigger tgr_classes_update
auf Klassen erstellen
für Update
als
@oldName varchar(20), @newName varchar(20);
deklarieren - -Daten vor der Aktualisierung
select @oldName = Name von gelöscht;
if (exists (select * from student where name like '%'+ @oldName + '%')))
begin
-The aktualisierte Daten SELECT @Newname = Name aus eingefügtem;
Update Student Set name = Ersetzen (name, @OLDNAME, @Newname) wobei Name wie '%'+ @oldname + '%' ist;
drucken ';
end
else
print 'Die Schülertabelle muss nicht geändert werden! ';
Los
--Daten abfragen
Wählen Sie * aus der Reihenfolge der Schüler nach ID aus.
Wählen Sie * aus den Klassen aus ';
Der Aktualisierungstrigger speichert die Daten vor der Aktualisierung in der eingefügten Tabelle, nachdem er die Daten aktualisiert hat, und speichert die aktualisierten Daten in der eingefügten Tabelle.
# Update Update-Spaltenebenen-Trigger
if (object_id('tgr_classes_update_column', 'TR') is not null)
Drop Trigger tgr_classes_update_column go
Trigger tgr_classes_update_column erstellen
auf Klassen
für Aktualisierung
as
--Spaltenebene-Trigger: ob die Klassenerstellungszeit aktualisiert wird
wenn (update(createDate))
beginnt
raisError('System prompt: Der Zeitpunkt der Klassenerstellung kann nicht geändert werden!', 16, 11);
rollback tran;
end
go
--Test
select * from Reihenfolge der Schüler nach ID;
wähle * aus Klassen aus;
Aktualisiere die Klassen set createDate = getDate(), wobei die ID = 3 ist;
Aktualisiere die Klassen set name = 'Klasse 4', wobei die ID = 7;
Trigger auf Spaltenebene aktualisieren können mithilfe von update bestimmen, ob Spaltendatensätze aktualisiert werden sollen.
Der Vorgang (Einfügen, Aktualisieren, Löschen) führt nur den Inhalt des Triggers selbst aus.
Grammatik erstellen
Trigger tgr_name erstellen
auf Tabellenname
mit Verschlüsselung
statt aktualisieren...
als
T-SQL
# Stattdessen erstellen des Triggers
if (object_id('tgr_classes_inteadOf', 'TR') is not null)
Trigger tgr_classes_inteadOf löschen
go
Trigger tgr_classes_inteadOf
auf Klassen
erstellen statt delete/*, update, insert*/
as
deklariere @id int, @name varchar(20);
--Gelöschte Informationen abfragen, Wert zuweisen
select @id = id , @ name = Name aus gelöscht;
print 'id: ' + konvertieren(varchar, @id) + ', name: ' + @name;
--Zuerst Schülerinformationen löschen
Schüler löschen, wobei cid = @ id;
--Klasseninformationen löschen
Klassen löschen, wobei id = @id;
print 'Löschen [ id: ' + konvertieren(varchar, @id) + ', name: ' + @name + ' ] Informationen erfolgreich! ';
los
--test
wähle * aus Schülerreihenfolge nach ID;
wähle * aus Klassen;
lösche Klassen mit ID = 7;
# Benutzerdefinierte Nachricht anzeigen raiseerror
if (object_id('tgr_message', 'TR') is not null)
Trigger tgr_message löschen
go
Trigger tgr_message erstellen
on student
nach dem Einfügen aktualisieren
as raisError('tgr_message trigger is triggered', 16, 10);
go
--test
insert into student effects('lily', 22, 1, 7);
Studentensatz Geschlecht = 0 aktualisieren, wobei Name = 'Lucy';
Wählen Sie * aus der Studentenreihenfolge nach ID aus;
# Auslöser ändern
Auslöser ändern tgr_message
auf Schüler
nach dem Löschen
as raisError('tgr_message trigger is Triggered', 16, 10);
go
--test
vom Schüler löschen, wobei Name = 'lucy' ;
# Trigger aktivieren und deaktivieren
--Trigger deaktivieren
Trigger tgr_message für Schüler deaktivieren;
--Trigger aktivieren
Trigger tgr_message für Schüler aktivieren;
# Erstellte Triggerinformationen abfragen
--Vorhandene Trigger abfragen
select * from sys.triggers;
select * from sys.objects where type = 'TR';
--Trigger-Auslösungsereignisse anzeigen
wählen Sie te.* aus sys.trigger_events aus, um sys.triggers beizutreten
auf t.object_id = te.object_id
wobei t.parent_class = 0 und t.name = ' tgr_valid_data';
--Anzeigen der Erstellungs-Trigger-Anweisung
exec sp_helptext 'tgr_message';
# Beispiel, eingefügte Daten überprüfen
if ((object_id('tgr_valid_data', 'TR') ist nicht null))
Trigger tgr_valid_data löschen
go
Trigger tgr_valid_data
auf Student erstellen
nach Einfügen
als
deklariere @age int,
@name varchar(20);
wähle @name = s.name, @age = s.age aus eingefügtem s;
if (@age < 18)
begin
raisError('Es gibt ein Problem beim Einfügen des Alters neuer Daten', 16, 1);
rollback tran;
end
go
--test
insert into student Werte('Wald', 2, 0, 7);
in Schüler einfügen Werte('Wald', 22, 0, 7);
* aus Schülerreihenfolge nach ID auswählen;
# Beispiel, Operationsprotokoll
if (object_id('log', 'U') is not null)
drop table log
go
create table log(
id int Identity( 1, 1) Primärschlüssel,
Aktion varchar(20),
createDate datetime default getDate()
)
go
if (exists ( select * from sys.objects where name = ' tgr_student_log'))
Trigger tgr_student_log
gehen
Trigger tgr_student_log
auf Student erstellen
nach dem Einfügen, aktualisieren, löschen
als
wenn ((existiert (wählen Sie 1 aus eingefügt aus )) und (existiert (wählen Sie 1 aus den gelöschten)))
begin
insert into log(action) value('updated');
end
else if (exists (wählen Sie 1 aus den eingefügten) und nicht existiert (wählen Sie 1 aus den gelöschten))
begin
insert into log(action) Values('inserted');
end
else if ( not exist (wählen Sie 1 aus den eingefügten) und existiert (wählen Sie 1 aus gelöscht))
beginnen
in Protokoll(aktion)werte('gelöscht') einfügen;
Ende
gehen
-- Test
in Schülerwerte einfügen(' König', 22, 1, 7);
Studentensatz Geschlecht = 0 aktualisieren, wobei Name = 'König';
Student löschen, wobei Name = 'König';
* aus Protokoll auswählen;
auswählen * aus Studentenbestellung nach ID;