Advertisement
Guest User

Untitled

a guest
Jun 12th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 3.57 KB | None | 0 0
  1. CREATE OR REPLACE TRIGGER tr_diplbens
  2.     INSTEAD OF INSERT OR UPDATE OR DELETE
  3.     ON diplbens
  4.     FOR EACH ROW
  5. DECLARE
  6.   --rc NUMBER := SQL%ROWCOUNT;
  7.   fehlercheck1 NUMBER;
  8.   hauptverantwortlich NUMBER := 1;
  9. BEGIN
  10.   --  0 Records ist unmöglich, weil  for each row trigger immer 1 record
  11.   --IF rc = 0 THEN RAISE_APPLICATION_ERROR(-20001, 'No rows affected'); END IF;
  12.  
  13.   IF updating
  14.   THEN
  15.  
  16.     UPDATE tdiplbens
  17.     SET dib_isthauptverantwortlich = CASE :old.dib_isthauptverantwortlich
  18.                                       WHEN 1 THEN 1
  19.                                       ELSE :NEW.dib_isthauptverantwortlich
  20.                                      END, -- man kann hauptverantwortlich nicht von 1 auf 0 setzen
  21.         dib_stundenanzahl          = :NEW.dib_stundenanzahl,
  22.         dib_diplomprojekt          = :NEW.dib_diplomprojekt,
  23.         dib_benutzer               = :NEW.dib_benutzer
  24.     WHERE dib_diplomprojekt = :old.dib_diplomprojekt AND dib_benutzer = :old.dib_benutzer;
  25.  
  26.     IF :old.dib_isthauptverantwortlich = 0 AND :NEW.dib_isthauptverantwortlich = 1
  27.     THEN           -- neuer Hauptverantwortlicher wird gesetzt
  28.       UPDATE tdiplbens
  29.         SET DIB_ISTHAUPTVERANTWORTLICH = 0
  30.       WHERE DIB_DIPLOMPROJEKT = :old.DIB_DIPLOMPROJEKT AND
  31.             dib_benutzer IN (SELECT dib_benutzer
  32.                                FROM tbenutzer inner join tdiplbens ON dib_benutzer = Ben_id
  33.                               WHERE DIB_DIPLOMPROJEKT = :old.DIB_DIPLOMPROJEKT AND
  34.                                     ben_Benutzerart = (SELECT ben_benutzerart FROM tbenutzer
  35.                                                         WHERE ben_id = :old.dib_benutzer ) AND
  36.                                     ben_id != :old.dib_benutzer
  37.                             );
  38.     END IF;
  39.  
  40.   END IF;
  41.  
  42.  
  43.  
  44.   IF inserting
  45.   THEN
  46.     INSERT INTO tdiplbens (dib_diplomprojekt, dib_benutzer, dib_isthauptverantwortlich, dib_stundenanzahl)
  47.     VALUES(:NEW.dib_diplomprojekt, :NEW.dib_benutzer, :NEW.dib_isthauptverantwortlich, :NEW.dib_stundenanzahl);
  48.  
  49.     IF :NEW.dib_isthauptverantwortlich = 0
  50.     THEN           -- neuer Hauptverantwortlicher wird gesetzt
  51.       UPDATE tdiplbens
  52.         SET DIB_ISTHAUPTVERANTWORTLICH = 0
  53.       WHERE DIB_DIPLOMPROJEKT = :NEW.DIB_DIPLOMPROJEKT AND
  54.             dib_benutzer IN (SELECT dib_benutzer
  55.                                FROM tbenutzer inner join tdiplbens ON dib_benutzer = Ben_id
  56.                               WHERE DIB_DIPLOMPROJEKT = :NEW.DIB_DIPLOMPROJEKT AND
  57.                                     ben_Benutzerart = (SELECT ben_benutzerart FROM tbenutzer
  58.                                                         WHERE ben_id = :NEW.dib_benutzer ) AND
  59.                                     ben_id != :NEW.dib_benutzer
  60.                             );
  61.     END IF;
  62.   END IF;
  63.  
  64.   IF deleting THEN
  65.  
  66.     IF :old.dib_isthauptverantwortlich = 1 THEN
  67.       RAISE_APPLICATION_ERROR(-20002, 'Deleting a user with "hauptverantwortlichen" tag is not allowed');
  68.     END IF;
  69.  
  70.     DELETE FROM tdiplbens
  71.     WHERE dib_diplomprojekt = :old.dib_diplomprojekt AND dib_benutzer = :old.dib_benutzer;
  72.  
  73.   END IF;
  74.  
  75. END;
  76. /
  77.  
  78. DROP PROCEDURE testTriggerDiplBens;
  79.  
  80. CREATE PROCEDURE testTriggerDiplBens AS
  81. BEGIN
  82.   INSERT INTO diplbens (dib_diplomprojekt, dib_benutzer, dib_isthauptverantwortlich, dib_stundenanzahl)
  83.   VALUES (406, 464, 0, 10);
  84.   COMMIT;
  85.  
  86.   DELETE FROM diplbens
  87.   WHERE dib_diplomprojekt = 402 AND dib_benutzer = 457;
  88.   COMMIT;
  89.  
  90.   UPDATE diplbens
  91.   SET dib_isthauptverantwortlich = 1
  92.   WHERE dib_diplomprojekt = 394 AND dib_benutzer = 443;
  93.   COMMIT;
  94.  
  95. END;
  96. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement