Frage

Ich versuche, einen Trigger für eine Tabelle zu schreiben Insertion von zwei Namen zu vermeiden, die als IsDeleted nicht gekennzeichnet sind. Aber der erste Teil der Auswahl enthält die eingefügt ein und so die Bedingung ist immer wahr. Ich, dass obwohl FOR Schlüsselwort bewirkt, dass der Auslöser vor dem Einsetzen zu laufen, aber in diesem Fall wird die eingefügte Zeile ist bereits in der Tabelle. Bin ich falsch oder das ist, wie alle für Trigger Arbeit?

ALTER TRIGGER TriggerName
ON MyTable
FOR INSERT, UPDATE
AS
BEGIN 
    If exist (select [Name] From MyTable WHERE IsDeleted = 0 AND [Name] in (SELECT [Name] FROM INSERTED)
    BEGIN
    RAISERROR ('ERROR Description', 16, 1);
    Rollback;
    END  
END
War es hilfreich?

Lösung

läuft, nachdem die Daten geändert wird, STATT ist das, was ich denke, Sie sind nach.

EDIT: Wie bereits von anderen erwähnt, läuft STATT anstelle der Daten, die Sie ändern sich, daher müssen Sie die Daten einfügen, wenn sie gültig ist, anstatt zu stoppen, den Einsatz, wenn es ungültig ist

.

Bitte lesen Sie diese Frage für eine viel detailliertere Erläuterung der verschiedenen Arten von Triggern.

SQL Server "AFTER INSERT" Trigger nicht die gerade eingefügte Zeile

Andere Tipps

ist das gleiche wie nach. Wenn Sie vor dem Trigger „simulieren“ möchten, verwenden Sie STATT, Einschränkung, es ist nicht genau das, was Sie auf die richtige BEFORE-Trigger erwarten würde, das heißt, wenn Sie nicht die notwendige STATT Aktion, Ihr eingefügt / aktualisierte Daten zur Verfügung zu stellen könnten verloren / ignoriert werden.

MSSQL muss nicht BEFORE-Trigger.

Für SQL Server, für die Läufe NACH der SQL, die es ausgelöst hat.

Von: http://msdn.microsoft.com/en-us/library/ms189799. aspx

  

| NACH

     

nach gibt an, dass der DML-Trigger   nur wird ausgelöst, wenn alle Operationen   in der auslösenden SQL angegeben   Anweisung erfolgreich ausgeführt.   Alle Referenz Kaskade Aktionen und   Constraint Prüfungen müssen auch gelingen   bevor dieser Trigger ausgelöst wird.

     

nach ist die Standardeinstellung, wenn für die   nur Schlüsselwort angegeben.

     

nach Trigger   kann nicht auf Ansichten definiert werden.

Ich habe eigentlich lief in ein ähnliches Problem in letzter Zeit, und fand eine coole Art, es zu handhaben. Ich hatte eine Tabelle, die mehrere Zeilen für eine ID haben könnte, aber nur einer von ihnen könnte als primäre markiert werden.

In SQL Server 2008, werden Sie in der Lage sein, einen Teil eindeutigen Index, so etwas zu machen:

create unique index IX on MyTable(name) where isDeleted = 0;

Sie können jedoch mit ein wenig mehr Arbeit in SQL Server erreichen 2005. Der Trick nur die Zeilen zeigt eine Ansicht zu machen, die nicht gelöscht werden, und dann einen eindeutigen gruppierten Index für sie erstellen:

 create view MyTableNotDeleted_vw
 with schema_binding /* Must be schema bound to create an indexed view */
 as
 select name 
 from dbo.MyTable /* Have to use dbo. for schema bound views */
 where isDeleted = 0;

 GO

 create unique clustered index IX on MyTableNotDeleted_vw ( name );

Dies wird effektiv erstellen nur eine eindeutige Einschränkung Reihen zu beeinflussen, die noch nicht gelöscht worden ist, und wird wahrscheinlich ein bessere Leistung als ein benutzerdefinierten Trigger!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top