Trigger : Besoin d'une relecture avant de pourrir ma base...

Trigger : Besoin d'une relecture avant de pourrir ma base... - SQL/NoSQL - Programmation

Marsh Posté le 23-02-2005 à 17:18:34    

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 :
  1. CREATE TRIGGER trgLeaseSchedule ON LeaseSchedule FOR UPDATE
  2. AS
  3. BEGIN
  4. DECLARE  @AppName  char(30)
  5. SELECT DISTINCT @AppName = program_name from master..sysprocesses WHERE hostprocess = HOST_ID()
  6. IF @AppName <> 'CLASS' AND USER_NAME() <> 'dbo' AND @@NESTLEVEL = 0
  7. BEGIN
  8.  ROLLBACK TRANSACTION CLASSTRIGGER
  9.  RAISERROR (99000,15,1)
  10.  RETURN
  11. END
  12. ELSE
  13. BEGIN
  14.  DECLARE @scheduleid int
  15.  DECLARE curSch CURSOR FOR
  16.  select leasescheduleid from inserted where userights = 0
  17.  OPEN curSch
  18.  FETCH NEXT FROM curSch INTO @scheduleid
  19.  WHILE @@FETCH_STATUS = 0
  20.  BEGIN
  21.   DELETE zUserContractPerimeter
  22.   WHERE EXISTS (
  23.    SELECT null
  24.    FROM deleted
  25.    WHERE deleted.leasescheduleid = @scheduleid
  26.    AND deleted.UseRights = 1
  27.    AND zUserContractPerimeter.scheduleid = deleted.leasescheduleid
  28.   )
  29.   FETCH NEXT FROM curSch INTO @scheduleid
  30.  END
  31.  CLOSE curSch
  32.  DEALLOCATE curSch
  33. END
  34. END


 
J'ai un léger doute sur mon delete en fait :D
 
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 :D

Reply

Marsh Posté le 23-02-2005 à 17:18:34   

Reply

Marsh Posté le 24-02-2005 à 08:47:24    

Ben tu n'as qu'à faire une autre table zUserContractPerimeter_Arjuna créée à partir de zUserContractPerimeter :
 

Code :
  1. CREATE TABLE zUserContractPerimeter_Arjuna
  2. AS SELECT * FROM zUserContractPerimeter;


 
Et faire le delete dans celle-là pour faire tes tests ...
 
Ou encore, au lieu de faire un DELETE, ajoute un champ TO_DELETE dans zUserContractPerimeter et fais un UPDATE ... comme ça tu verras si tu flag les bonnes lignes à effacer ;)

Reply

Marsh Posté le 24-02-2005 à 09:20:24    

mouais, mais je suis très fénéant :D je me disais que si vous le faisiez à ma place, ça serait mieu [:ddr555]
 
finalement, j'ai lancé le truc (pas trop fort pour pas le casser), et j'ai obtenu une ou deux erreurs à la con à cause du nom du curseur déjà utilisé dans une procédure déclenchant le trigger (changé en local) et à part ça les données sont toujours là et ça fait ce que je lui demande, ça a donc l'air bon :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed