Je suis en train d'écrire un Trigger sur un base de données.
Et euh... En fait, je doute un peu (j'ai l'habitude de lancer ma requête bugguée, et débugguer au fur et à mesure, sauf que là ça va pas le faire).
Pour résumer, j'ai une table "LeaseSchedule", dans laquelle j'ai un champ "UseRights" à 0 ou 1.
J'ai une table "zUserContractPerimeter" qui permet de rattacher des droits utilisateurs à un schédule et ses fils (contracts).
Lorsque je décide de passer un schedule à une gestion sans droits (UseRights = 0), je veux aller supprimer tous les droits stipulés pour ce schedule, puisqu'ils sont devenus caduques.
Voilà le truc que j'ai pondu, en essayant d'optimiser un maximum le nombre de lignes traîtées :
Code :
- CREATE TRIGGER trgLeaseSchedule ON LeaseSchedule FOR UPDATE
- AS
- BEGIN
- DECLARE @AppName char(30)
- SELECT DISTINCT @AppName = program_name from master..sysprocesses WHERE hostprocess = HOST_ID()
- IF @AppName <> 'CLASS' AND USER_NAME() <> 'dbo' AND @@NESTLEVEL = 0
- BEGIN
- ROLLBACK TRANSACTION CLASSTRIGGER
- RAISERROR (99000,15,1)
- RETURN
- END
- ELSE
- BEGIN
- DECLARE @scheduleid int
- DECLARE curSch CURSOR FOR
- select leasescheduleid from inserted where userights = 0
- OPEN curSch
- FETCH NEXT FROM curSch INTO @scheduleid
- WHILE @@FETCH_STATUS = 0
- BEGIN
- DELETE zUserContractPerimeter
- WHERE EXISTS (
- SELECT null
- FROM deleted
- WHERE deleted.leasescheduleid = @scheduleid
- AND deleted.UseRights = 1
- AND zUserContractPerimeter.scheduleid = deleted.leasescheduleid
- )
- FETCH NEXT FROM curSch INTO @scheduleid
- END
- CLOSE curSch
- DEALLOCATE curSch
- END
- END
|
J'ai un léger doute sur mon delete en fait
Normalement, ce que j'ai voulu écrire (en tenant compte du curseur autour), c'est :
-> Supprime les lignes de zUserContractPerimeter où dans "deleted" (avant update de la table LeaseSchedule) je gérais des authorisations pour le schedule, et où dans inserted (après maj) je n'en gère plus.
Ca marche mon truc, ou si je vais vider ma base au premier essai ?
Je demande ça, parceque j'ai passé une partie de la journée à la remplir pour me faire des jeux de test, et ça me gonflerait de devoir tous me les re-taper