Comment interroger et exécuter le déclencheur sur la même table
Espère que quelqu'un peut aider avec ceci. Je suis nouveau à des déclencheurs et je suis en train de créer un déclencheur qui vérifie si l'enregistrement en cours de modification a une valeur spécifique.
exemple
J'ai une table appelée Dépôt qui a un filing_id et un filing_status, je veux éviter que quelqu'un de la mise à jour ou la suppression de tous les enregistrements dans cette table a un filing_status="DÉPOSÉE".
donc, si j'ai le texte suivant
Filing_id Filing_status Val
--------- ------------- ---
0 Filed X
Si quelqu'un a essayé de modifier le Val le déclencheur doit l'arrêter
J'ai créé le déclencheur suivant:
CREATE or replace TRIGGER TRG_PREV_FILING
BEFORE DELETE or UPDATE
ON PF.FILING
FOR EACH ROW
declare
rowcnt number;
BEGIN
SELECT COUNT(filing_id) INTO rowcnt FROM PF.FILING
where status = 'FILED'
and filing_id = :new.filing_id;
if (rowcnt > 0)
then
raise_application_error (-20100, 'You can not delete Or Update initial record');
end if;
END;
Le problème, je suis confronté est que j'obtiens:ORA-04091 qui est le "Tableau de Dépôt est de muter, de Déclenchement et de fonction ne peuvent pas le voir"
Donc, fondamentalement, je ne permet pas d'interroger sur la même table que je suis d'exécution sur la gâchette? C'est que le problème dans mon cas et que quelqu'un connait un travail autour de cela?
J'apprécie toute l'aide
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas à interroger la table trigger se déclenche à être en mesure de faire ce genre de vérification. Vous pouvez obtenir la valeur d'une colonne qui est modifié à l'aide de
:old
. Voici un exemple:Le point de base est que vous devez concevoir votre base de données de manière à ce que le déclencheur n'est sa validation basée sur la mise à jour/ligne supprimée. Si vous avez plusieurs lignes avec le même
filing_id
alors vous pouvez surmenage vous conception de base de données. Peut-être que vous avez vraiment de contre-vérifier le tableau, dans ce cas vous pouvez utiliser:old
. Mais quand vous avez plusieurs lignes à vérifier (qui, je suppose, parce que vous faites un comte de), vous devez utiliser deux tables. Voici une suggestion.