J'essaie de consigner toutes les erreurs dans ma base de données dans une table. Alors que sys utilisateur je l'ai écrit le code suivant:Comment développer un déclencheur after serverror dans Oracle?
CREATE TABLE servererror_log (
error_datetime TIMESTAMP,
error_user VARCHAR2(30),
db_name VARCHAR2(9),
error_stack VARCHAR2(2000),
captured_sql VARCHAR2(1000));
/
CREATE OR REPLACE TRIGGER log_server_errors
AFTER SERVERERROR
ON DATABASE
DECLARE
captured_sql VARCHAR2(1000);
BEGIN
SELECT q.sql_text
INTO captured_sql
FROM gv$sql q, gv$sql_cursor c, gv$session s
WHERE s.audsid = audsid
AND s.prev_sql_addr = q.address
AND q.address = c.parent_handle;
INSERT INTO servererror_log
(error_datetime, error_user, db_name,
error_stack, captured_sql)
VALUES
(systimestamp, sys.login_user, sys.database_name,
dbms_utility.format_error_stack, captured_sql);
END log_server_errors;
Mais quand je force une erreur comme essayer de sélection d'une table non existante, il connecte l'erreur dans Indifférent Fume la table.
Y at-il un moyen de vérifier que la gâchette se déclenche? Aussi, j'ai essayé de créer une table de test à insérer là mais ça ne marche pas non plus, même si on définit le trigger comme une transaction autonome et commettre à l'intérieur du trigger.
Merci, Joaquin
cela ne fonctionne pas. J'ai aussi essayé cette même approche avant avec aucun résultat. Il semble que le déclencheur ne tire pas. D'autres idées? Savez-vous comment puis-je vérifier si un déclencheur a été déclenché? Quelque chose comme une vue avec une colonne LAST_FIRED_TIME ou quelque chose comme ça. Merci Joaquin – xocasdashdash
Pourrait être l'insertion. Le problème est, si le déclencheur échoue, il est difficile à attraper. J'utiliserais UTL_FILE ou une procédure séparée avec transaction autonome. Voir http://stackoverflow.com/questions/492705/-there-any-way-to-log-all-failed-sql-statements-in-oracle-10g –