La capture de Paquet ou de l'intervention/nom de la Fonction à partir d'un déclencheur
J'ai une table (Oracle 11g) sur lequel plusieurs packages/stockées procs exécuter des instructions DML. Je veux capturer le paquet ou le nom de la procédure qui a délivré le DML sur la table à l'aide d'un déclencheur et l'enregistrer dans une table de journalisation.
Par exemple:
Paquet MY_PACK.MY_PROC()
questions un insert into...
pour la table mytab
. Je voudrais concevoir un déclencheur sur mytab
qui doit être en mesure de capturer le paquet ou le nom de la procédure qui a émis le insert into..
et de stocker cette information dans un autre tableau my_tab_log
.
J'ai fait quelques recherches et trouvé que $$PLSQL_UNIT
et $$PLSQL_LINE
pouvait indiquer le nom de la procédure, mais si ces variables sont utilisées dans un déclencheur, le nom du déclencheur serait capturé au lieu de l'emballage/le nom de la procédure qui a émis l'instruction DML.
comme -
CREATE OR REPLACE TRIGGER my_trg
AFTER INSERT OR UPDATE OR DELETE
ON MY_TAB
FOR EACH ROW
BEGIN
IF INSERTING THEN
insert into my_tab_log values('INSERTED A ROW'
sysdate,
$$PLSQL_UNIT);
END IF;
-- This would capture Trigger name but I would like to capture `MY_PACK.MY_PROC()`
-- which issued the insert statement
...
END;
Maintenant depuis $$PLSQL_UNIT est une directive de compilation conditionnelle. Il est résolu lorsque vous complie/recompiler le code PL/SQL. Donc, malheureusement, $$PLSQL_UNIT au sein de déclenchement n'est rien de plus mais du nom du déclencheur et est résolu à déclencher moment de la compilation.
J'ai aussi trouvé la procédure owa_util.who_called_me
mais je ne pouvais pas envelopper la tête autour de sur comment je pourrais l'utiliser pour l'adapter à mes besoins. Est-il même possible de réaliser ce que je veux sans faire de changements pour les paquets réels/stockées procs qui délivre les instructions DML? Je ne peux pas modifier ces programmes, et c'est difficile de restriction, donc ce n'est pas une option.
OriginalL'auteur Annjawn | 2013-01-28
Vous devez vous connecter pour publier un commentaire.
$$PLSQL_UNIT
ne fournirait que le nom du paquet, pas le nom de la procédure dans le package. La même chose est vraie dewho_called_me
.owa_util.who_called_me
est basé sur un petit utilitaire écrit par l'inestimable M. Kyte. Si vous prenez un coup d'oeil à son code source ici vous verrez que la routine obtient ses informations à partir de la pile d'appel. Donc l'information qu'il propose est:Ces certes frustrant limitations sont à la baisse de la surcharge: nous pouvons créer emballés procédures avec le même nom mais des signatures différentes. Par conséquent, "le nom de la procédure" n'est pas particulièrement utile pour le système quand il s'agit de déterminer les morceau de code d'exploitation.
De toute façon, si vous voulez avoir un jeu avec
who_called_me
, il prend quatre paramètres comme ceci:Génial.... qui a bien fonctionné.
OriginalL'auteur APC