Oracle: Spalte aktualisieren per Trigger

Hallo,

ich habe folgendes Problem:

Beim INSERT oder UPDATE von TABELLE_T soll SPALTE_S2 per Trigger auf den Wert ‚true‘ gesetzt werden, wenn SPALTE_S1 die Bedingung LIKE ‚_A%‘ erfüllt. BEFORE oder AFTER ist eigentlich egal.

Ich habe schon alle möglichen Kombinationen des folgenden Codes ausprobiert:

CREATE OR REPLACE TRIGGER tr
–AFTER
BEFORE
INSERT OR UPDATE OF spalte1 ON tabelle_t
FOR EACH ROW
WHEN ( NEW.spalte1 LIKE ‚_A%‘ )
BEGIN

NEW.spalte2 = ‚true‘

–UPDATE table_t SET spalte2 = ‚true‘ WHERE spalte1 LIKE ‚_A%‘
END

Der Trigger lässt sich kompilieren - allerdings mit „warning“. Beim INSERT oder UPDATE kommt aber leider die Fehlermeldung „ORA-04098: trigger ‚tr‘ is invalid and failed re-validation“.

Für die Lösung wäre ich Euch sehr dankbar!

Gruß,

Martin

Hallo Martin,

welche Oracle-Version wird denn verwendet?
Bei älteren Versionen (ich meine 8 oder 9)
hatte ich schon das Problem, daß ich beim
Triggern einer Tabelle nicht innerhalb der
gleichen Tabelle ein Update machen konnte,
während der Trigger läuft.
Bei einem BEFORE UPDATE-Trigger würde ich es
mal so probieren:

CREATE OR REPLACE TRIGGER tr
BEFORE
INSERT OR UPDATE OF spalte1 ON tabelle_t
FOR EACH ROW
WHEN ( OLD.spalte1 LIKE ‚_A%‘ )
BEGIN
NEW.spalte2 = ‚true‘;
END;
/

Referenz auf eine ID? (old/new)

Ich habe hier gerade keine DB zur Verfügung, sonst
würde ich es ausprobieren.

Gruß,
Markus

Trigger

Hi,

Das geht so:

create or replace trigger trg_test
BEFORE
INSERT OR UPDATE OF spalte1 ON tabelle_t
FOR EACH ROW
declare
if :new.spalte_1 like ‚A%‘ then
:new.spalte_2:=‚true‘;
end if;
begin
enf;
/

Hallo Martin,
hier ein Test-Script:

create table TABELLE_T
(
SPALTE_S1 VARCHAR2(10),
SPALTE_S2 VARCHAR2(10)
);

create or replace trigger test_t_trigger
before insert or update on tabelle_t
for each row
declare
– local variables here
begin
if :new.spalte_s2 like ‚_A%‘
then
:new.spalte_s1 := ‚true‘;
end if;

end test_t_trigger;
/

insert into tabelle_t (spalte_s2) values (‚XABC‘);
insert into tabelle_t (spalte_s2) values (‚XXBC‘);

select * from tabelle_t;

Ergebnis:

SPALTE_S1 SPALTE_S2


true XABC
XXBC

Wie man sieht, hat nur die Zeile mit XABC in Spalte_s1 den Wert true.

Hallo

Leider kann ich auch nicht helfen. Ich arbeite schon seit lägerem nicht mehr mit Oracle.

Sorry und Gruss
Beat

Hallo Martin,

bin erst heute Nacht aus dem Urlaub zurück, sorry, antworte sonst schneller.
Versuch es mal so:

create table table_t
(spalte_s1 varchar2(20),
spalte_s2 varchar2(20));
CREATE OR REPLACE TRIGGER tr
BEFORE
INSERT OR UPDATE OF spalte_s1 ON table_t
FOR EACH ROW
WHEN ( new.spalte_s1 LIKE ‚_A%‘ )
BEGIN
:NEW.spalte_s2 := ‚true‘;
END;
/
insert into table_t (spalte_s1) values(‚MOIN‘);
insert into table_t (spalte_s1) values(‚MENSCH‘);
commit;

select * from table_t;

Gruß Grisu

Hallo Martin,

so vielleicht

create or replace trigger trg_bi_tabelle_t
before insert on tabelle_t
for each row

begin
IF :new.spalte1 like ‚_A%‘ THEN
:new.spalte2 = ‚true‘
END IF;
end trg_bi_tabelle_t;

Gruß
Haiko