Supposons que j'ai une table my_table(id, x, y)
. Je veux écrire un triggersur pour empêcher la mise à jour de y
col et le mettre à une valeur non-null
si x
est déjà null
. Comme SQL Server n'a pas de triggersur avant la mise à jour, comment cela peut-il être fait? Apparemment, nous pouvons utiliser un instead of
triggersur à cet effet, mais comment pouvons-nous vérifier les valeurs anciennes et actuelles et décider si nous devrions triggersr une erreur ou laisser la mise à jour s'exécuter normalement?
Exemple:
Imaginons que nous ayons cette ligne dans la BD:
1, null, null
Alors ceci devrait échouer (augmenter l'erreur)
update my_table set y = 'blah' where id = 1;
Mais cela devrait réussir:
update my_table set y = null where id = 1;
Je sais que l'exemple n'est pas très significatif, mais il est semblable à ce que j'essaie d'accomplir.
Cela devrait fonctionner, mais je ne suis pas sûr de savoir quelles autres conditions de bord vous devez gérer:
create table my_table (id int identity, x varchar(20), y varchar(20)) go CREATE TRIGGER tgNotNullYonMyTable ON my_table FOR UPDATE AS IF UPDATE(y) BEGIN IF exists ( select 1 from deleted d join inserted i on i.id = d.id where (dx is null or ix is null) and iy is null ) BEGIN RAISERROR ('Leave Y alone if x is null.', 16, 1) rollback tran END END go insert my_table values (null,null) go update my_table set y = 'blah' where id = 1; go update my_table set y = null where id = 1;
CREATE TRIGGER yxnull ON mytable FOR UPDATE AS IF UPDATE(y) BEGIN IF deleted.x is null and inserted.y is not null BEGIN RAISERROR ('Leave Y alone if x is null.', 16, 1) ROLLBACK TRANSACTION END END go