Trigeer pilnujący nieautoryzowanych zmian w bazie :>

0

Witam serdecznie.
Sprawa wygląda tak:
Chcę stworzyć triggera, który przed update tabeli zapisze sobie stare dane do jakiejś innej tabeli.
To co wymiodziłem wygląda tak:

set term ^;
create trigger tig_upd for wynagrodzenie
active before update
as
begin
  if(new.wyplata <> old.wyplata) then
    (
    old.wynagrodzenie.imie=new.wyn_back.imie,
    old.wynagrodzenie.nazwisko=new.wyn_back.nazwisko,
    old.wynagrodzenie.wyplata=new.wyn_back.przed,
    new.wynagrodzenie.wyplata=new.wyn_back.po,
    new.wyn_back.data=(set date()),
     )
end
^
set term ;^

Błąd to:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 6, char 3

Czyli problem najprawdopodobniej znajduje się w if-ie i nawiasie w tym bloku. Jeśli tak, to jakiego nawiasu mam użyć? Jeśli nie, to gdzie jest błąd? :>

0

może byś tak zaczął od podania bazy ...

0

Bazę też mogę poznać:

/* Table: WYNAGRODZENIE, Owner: SYSDBA */

CREATE TABLE "WYNAGRODZENIE" 
(
  "ID_WYN"	INTEGER NOT NULL,
  "IMIE"	VARCHAR(25) CHARACTER SET WIN1250 NOT NULL,
  "NAZWISKO"	VARCHAR(25) CHARACTER SET WIN1250 NOT NULL,
  "WYPLATA"	VARCHAR(11) CHARACTER SET WIN1250 NOT NULL,
 PRIMARY KEY ("ID_WYN")
);
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER "TIG_WYN" FOR "WYNAGRODZENIE" 
ACTIVE BEFORE INSERT POSITION 0
as
begin
  new.ID_WYN=gen_id(ID_WYN, 1);
end
 ^

COMMIT WORK ^
SET TERM ;^


/* Table: WYN_BACK, Owner: SYSDBA */

CREATE TABLE "WYN_BACK" 
(
  "ID_BACK"	INTEGER NOT NULL,
  "IMIE"	VARCHAR(25) CHARACTER SET WIN1250 NOT NULL,
  "NAZWISKO"	VARCHAR(25) CHARACTER SET WIN1250 NOT NULL,
  "PRZED"	VARCHAR(11) CHARACTER SET WIN1250 NOT NULL,
  "PO"	VARCHAR(11) CHARACTER SET WIN1250 NOT NULL,
  "DATA"	DATE NOT NULL,
 PRIMARY KEY ("ID_BACK")
);
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER "TIG_BACK" FOR "WYN_BACK" 
ACTIVE BEFORE INSERT POSITION 0
as
begin
  new.ID_BACK=gen_id(ID_BACK, 1);
end
 ^

COMMIT WORK ^
SET TERM ;^

Teoretycznie powinny wystarczyć jakieś przykłady, to powinienem sobie pomóc.
A opisowo chodzi mi o to, że jak ktoś będzie chciał zrobić UPDATE na tabeli i zmienić wartość danej kolumny to przed tym baza zapisze sobie stare dane do innej tabeli.

0

Miśkowi chodziło raczej o nazwę bazy...

0

obiecuję, że zacznę pisać bez skrótów myślowych :/ :D

0

InterBase 6

0

Perelka jak nic [rotfl]

0

No to pięknie :/ Teraz pewnie już nie znajdę tu odpowiedzi :/
Może przynajmniej drogowskaz, gdzie szukać? :>

0

z tego co widać to

  1. zamień () na begin end bo chyba takie mają spełniać zadanie
  2. jak już to spróbuj pisać nazwy w "" i dużymi literami
  3. new.wyn_back.imie nie możesz używać odwołań do innych tabel niż tej dla której został wywołany wyzwalacz w ten sposób
  4. nie możesz używać new(old).nazwa_tabeli bo to nie cała tabela zmienia wartość tylko jeden rekord

a dokumentacja to tu http://www.firebirdsql.org/index.php?op=doc - InterBase 6.0 Manuals

0

Po przestudiowaniu kilku przykładów i dokumentacji udało się.
Tiger wygląda tak:

SET TERM ^ ;

CREATE TRIGGER "TIG_UPD" FOR "WYNAGRODZENIE" 
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if (new.wyplata <> old.wyplata) then
    insert into WYN_BACK (ID_BACK, IMIE, NAZWISKO, PRZED, PO, DATA) values (0, 'old.imie', 'old.nazwisko', 'old.wyplata', 'new.wyplata', '2007-01-01');
end
 ^

COMMIT WORK ^
SET TERM ;^

Dziękuję wszystkim za pomoc :]

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