2016-03-31 9 views
0

Ich war nur, um herauszufinden, wie man einen einfachen Auslöser zu tun, wenn ichSQL-Trigger für Update

Heres das Setup

CREATE TABLE marriage(
personid int 
married varchar(20) 
); 

INSERT INTO marriage 
values (1, unmarried); 

eine Zeile aktualisiert, was im zu tun versuchen, ist ein SQL-Trigger zu erstellen, die werde es so machen, dass wenn ich jemanden update, kann nur von verheiratet zu geschieden gehen, aber nicht unverheiratet zu geschieden.

Wenn mir jemand bei der Strukturierung helfen kann dies das wäre

+2

Update-Tabelle hilft. Und machen Sie Operationen in diesem Verfahren. Vielleicht brauchen Sie keinen Trigger zu schreiben? – osmanraifgunes

+0

Vorsicht mit diesem. Du kannst einen "heiligen Krieg" beginnen. Einige werden dies als Geschäftslogik betrachten und feststellen, dass es in Ihrem Speichersystem keine Probleme gibt. Andere werden kein Problem mit diesem Ansatz sehen. Aber in jedem Fall ist es etwas, worüber man nachdenken muss. –

+0

Wie wird Ihr Tisch aktualisiert? –

Antwort

0

groß sein Das ist, was ich suchte, wenn jemand war auf der Suche nach etwas ähnlichen

alter trigger 
trigtest3 
on married 
for update 
as 
begin 
    declare @old varchar(20) 
    declare @new varchar(20) 

    select @old = married from deleted 
    select @new = married from inserted 
    if(@old like 'Unmarried' AND @new like 'Divorced') 
     rollback 
end 
+0

Diese Lösung funktioniert nur für einen Datensatz. Wenn mehrere Datensätze aktualisiert werden, erhalten Sie nur eine Zeile. Dies ist nicht festgelegt basierend auf – JVM

+1

Sie möchten 'RaIsError' oder' Throw' hinzufügen, wenn Sie ein Rollback ausführen. Würdest du nicht eher einen Fehler bekommen wie: "Ich kann MaritalStatus nicht von 'unverheiratet' zu, geschieden 'ändern." eher als ein generischer Einsatz Booboo? – HABO

0

SQL Server nicht pro-Reihe bereitstellt löst leider aus, löst aber nur für einen kompletten Befehl aus. Und mit einem einzigen Aktualisierungsbefehl können mehrere Zeilen aktualisiert werden. Sie müssen also prüfen, ob mindestens eine betroffene Zeile einer verbotenen Änderung unterzogen wurde. Dazu fügen Sie die Pseudotabellen deleted und inserted einer Spalte oder einer Kombination von Spalten hinzu, die einen Datensatz (d. H. Den Primärschlüssel) eindeutig identifizieren.

create trigger trg_upd_married on marriage for update as 
begin 
    declare @error_count int 

    select @error_count = count(*) 
    from deleted d 
    join inserted i on i.id = d.id 
    where d.married = 'Unmarried' 
    where i.married = 'Divorced' 

    if @error_count > 0 
    begin 
    raiserror('Unmarried persons cannot get divorced.', 16, 121) 
    rollback transaction 
    end 
end; 

Der obige Trigger kann weiterhin Fehler enthalten. Ich spreche nicht fließend mit TSQL (und bemerke nur, dass ich seine Auslöser ziemlich ungeschickt finde - zumindest im Vergleich zu den Auslösern von Oracle, an die ich gewöhnt bin).

0

Sie müssen anstelle von Triggern verwenden, da Sie eine Aktualisierung verhindern müssen. Für Update-Trigger werden nach dem Einfügen ausgeführt. Verwenden Sie den folgenden Code -

create trigger abc on marriage 
for instead of update 
as 
begin 
Begin transaction 
if exists(select 1 from deleted as a 
inner join inserted as b 
on a.personid = b.personid 
where a.married = 'unmarried' and b.married = 'Divorced') 
begin 
raiserror('Status can not be changed from unmarried to Divorced',16,1) 
Rollback transaction 
end 
else 
begin 
update a 
set a.married = b.married 
from marriage as a 
inner join inserted as b 
on a.personid = b.personid 
Commit transaction 
end 
end 

Lassen Sie mich wissen, ob dies durch gespeicherte Prozedur