PLSQL trigger update jeśli nie zmieniam autora

0

Cześć,

CREATE OR REPLACE TRIGGER TRIGGER_TAB
  BEFORE INSERT OR UPDATE ON TAB
  FOR EACH ROW
  DECLARE username varchar(50);
BEGIN
  SELECT USER into username FROM DUAL;
    IF :NEW.AUTHOR is null 
    THEN
     :NEW.AUTHOR := username;
    END IF;
END;

Potrzebuję napisać trigera który przy modyfikacji danych dopisze autora do rekordu, ale tylko wtedy gdy nie updatetuję kolumny z autorem.
Innymi słowy jeśli

update TAB set COL1 = 'Piłka' where id = 1

To powinien wstawić mi nazwę zalogowanego użytkownika bazodanowego

update TAB set COL1 = 'Piłka', AUTHOR =  'Marcelina'  id = 1

Wtedy ma wstawić słowo Marcelina

Przypadek drugi działa, niestety przypadek pierwszy działa tylko jeśli dodam AUTHOR = null

2

jeśli w update nie wymienisz danej kolumny to w :new.pole ma ona wartość taką jak :old.pole - nie jest nullem

aby sprawdzić czy kolumna była zmieniana trzeba użyć
IF UPDATING('AUTHOR') THEN

0

Bo masz ustawionego triggera na całej tabeli ustaw go tylko na wybrane pola czyli:

CREATE OR REPLACE TRIGGER TRIGGER_TAB
  BEFORE INSERT OR UPDATE OF <TUTAJ LISTA PÓL PO PRZECINKU CZYLI NP COL1, COL2 ... bez pola AUTHOR> ON TAB
  FOR EACH ROW
  DECLARE username VARCHAR(50);
BEGIN
  SELECT USER INTO username FROM DUAL;
  :NEW.AUTHOR := username;
END;
0
abrakadaber napisał(a):

jeśli w update nie wymienisz danej kolumny to w :new.pole ma ona wartość taką jak :old.pole - nie jest nullem

aby sprawdzić czy kolumna była zmieniana trzeba użyć
IF NOT UPDATING('AUTHOR') THEN

@abrakadaber Dzięki za pomoc to działa w pryzpadku update-u

Ale wyszedł jeszcze problem z zwykłym insertem. Podczas wstawiania nowego rekordu chciałbym żeby działało to podobnie. To znaczy jeśli insertuję autora to wprowadzam autora, a jeśli pomijam ta kolumnę to żeby wkleił się zalogowany użytkownik z bazy.

2

taki warunek powinien załatwić sprawę IF (INSERTING AND :new.AUTHOR IS NULL) OR UPDATING('AUTHOR') THEN

0

Działa :)

  
SELECT USER into username FROM DUAL;
  IF (INSERTING AND :NEW.AUTHOR IS NULL) OR (UPDATING AND NOT UPDATING('AUTHOR')) THEN
     :NEW.AUTHOR := username;
 END IF;

Dziękuję @abrakadaber

1 użytkowników online, w tym zalogowanych: 0, gości: 1