I am writing an application that does inserts, which are supposed
to cause the trigger to fire if the attribute idclient was NULL and
the attribute class_of_service <= 3.
In this case, this row should be deleted.
However, the inserts fail with the error
"ORA-04098: trigger 'TRG_USER' is invalid and failed re-validation"
If I submit the same insert from an SQL prompt (after creation of the
trigger) I also get this error.
Here the definition of the trigger:
CREATE TRIGGER TRG_USER
AFTER INSERT OR UPDATE ON tbl_user
FOR EACH ROW WHEN (new.class_of_service <= 3 and new.idclient is null)
BEGIN
delete from tbl_user where class_of_service <= 3 and idclient is
null
END;
This smells like a permissions problem of some kind, but I can't find
anything in the docs about it. Can anybody clue me in?
why don't you use a check-constraint?
regards,
markus
Wie in einer anderen Antwort bereits angemerkt wäre hier ein
check-constraint wohl besser angebracjt, aber füg mal ein "show errors"
ein nach dem Trigger:
CREATE TRIGGER TRG_USER
AFTER INSERT OR UPDATE ON tbl_user
FOR EACH ROW WHEN (new.class_of_service <= 3 and new.idclient is null)
BEGIN
delete from tbl_user where class_of_service <= 3 and idclient is
null
END;
/
SHOW ERRORS
/
Sollte verraten was nicht korrekt ist.
Wenn ich recht erinnere kann man aber Daten der Tabelle auf die sich der
Trigger bezieht nicht in dem Trigger nicht nutzen.
> takeFive wrote:
[..]
>
> Wie in einer anderen Antwort bereits angemerkt wäre hier ein
> check-constraint wohl besser angebracjt, aber füg mal ein "show errors"
> ein nach dem Trigger:
Ein Check-Constraint würde aber zu einem anderen Verhalten des Systems
führen (das aber vermutlich auch gewünscht wäre). Der Check-Constraint
würde das Tuppel nicht einfügen und eine Fehlermeldung zurückgeben.
Die Lösung mit Trigger würde (wenn sie denn funktionieren würde) das
Tuppel einfügen und anschließend (evtl. mit anderen schon vorhandenen)
wieder löschen. Nach oben würde keine Fehlermeldung gegeben werden.
[..]
>
> Wenn ich recht erinnere kann man aber Daten der Tabelle auf die sich der
> Trigger bezieht nicht in dem Trigger nicht nutzen.
>
Da ist glaube ich ein "nicht" zu viel drinnen ;-)
Bei Oracle weiss ich es nicht, bei Informix ist es auf jeden Fall nicht
erlaubt, innerhalb der Tabelle des Triggers erneut auf die (gleichen
Attribute der) Tabelle zuzugreifen. Damit soll ein rekursiver
Triggeraufruf verhindert werden, allerdings wären dafür nicht diese
strengen Massnahmen notwendig.
Tschuess
Wolfgang