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