ÄÚ´úÂ뾡Á¿Òª¼òµ¥£¬Èç¹û±È½Ï¸´Ôӵϰ¿ÉÒÔ½«¸´ÔÓ µÄÓï¾ä´æ·Åµ½¹ý³ÌÖУ¬´¥·¢Æ÷Ö»µ÷Óùý³Ì
--2 DDL´¥·¢Æ÷ DDL statements (CREATE, ALTER, DROP)
/*
DDL´¥·¢Æ÷Ëù×÷ÓõĶÔÏó¾Í²»ÊÇij¸ö¾ßÌåµÄ±íÁË£¬¶øÊÇÕë¶Ôij¸öSCHEMA|DATABASE
DDL´¥·¢Æ÷Ä¿µÄÖ÷ÒªÊÇΪÁ˼ǼDDL²Ù×÷£¬
µ±È»Ò²¿ÉÔÚ´¥·¢Æ÷ÖÐÉú³ÉÒì³££¬ÊÂÎñ»Ø¹ö£¬DDL²Ù×÷ʧ°Ü
oracle Êý¾Ý¿âϵͳʼþÊôÐÔº¯Êý:
ora_client_ip_address:¿Í»§¶ËipµØÖ·
ora_database_name:µ±Ç°Êý¾Ý¿âÃû
ora_dict_obj_name:DDL²Ù×÷Ëù¶ÔÓ¦µÄÊý¾Ý¿â¶ÔÏóÃû
ora_dict_obj_owner:DDL²Ù×÷¶ÔÏóµÄËùÓÐÕß
ora_dict_obj_type:DDL²Ù×÷Ëù¶ÔÓ¦µÄÊý¾Ý¿â¶ÔÏóµÄÀàÐÍ
ora_login_user:µÇ¼Óû§Ãû
ora_sysevent:´¥·¢Æ÷µÄϵͳʼþÃû³Æ
...
ÓÃÕâЩÊôÐÔ¿ÉÒÔÃèÊöDDL²Ù×÷
*/
--´´½¨¼Ç¼ddl²Ù×÷µÄtable
CREATE TABLE ddl_records(
event varchar2(30),
username varchar2(30),
owner varchar2(30),
objname varchar2(20),
objtype varchar2(10),
d_date date
)
CREATE OR REPLACE TRIGGER ddl_t
AFTER DDL ON SCHEMA --DLLÒ²¿ÉÒÔÊÇCREATE,DROP,ALTERµÄÈÎÒâ×éºÏ£¬×÷ÓöÔÏó¿ÉÒÔÊǵ±Ç°SCHEMA ,Ò²¿ÉÒÔÊÇDATABASE
BEGIN
insert into ddl_records values(
ora_sysevent,ora_login_user,ora_dict_obj_owner,
ora_dict_obj_name,ora_dict_obj_type,sysdate);
END;
--Ö´ÐÐÒ»¸öddl²Ù×÷
create table test_ddl_triger(id int);
--ddl_records±íÖвåÈëÒ»ÌõÊý¾Ý
/*
event:create,username:scott,owner:scott
objname:test_ddl_triger,objtype:table
*/
drop table test_ddl_triger;--ÓÖ²åÈëÒ»ÌõÊý¾Ý
commit;
--3. ϵͳʼþ´¥·¢Æ÷Database operations (SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN)
/*
ϵͳʼþ´¥·¢Æ÷ºÍDML´¥·¢Æ÷µÄ¹¦Äܲ¶à£¬¶¼ÊÇΪÁ˼Ǽ¸ú×ÙÊý¾Ý¿âµÄ±ä»¯¡£
²»¹ýÕâЩ´¥·¢Æ÷ÓеĶÔBEFOREºóAFTERÓÐÏÞÖÆ£º
STARTUPʼþÖ»ÄÜÓÐAFTER´¥·¢Æ÷
SHUTDOWNÖ»ÄÜÓÐBEFORE´¥·¢Æ÷
LOGONÖ»ÄÜÓÐAFTER´¥·¢Æ÷
LOGOFFÖ»ÄÜÓÐBEFORE´¥·¢Æ÷
SERVERERRORÖ»ÄÜÓÐAFTER´¥·¢Æ÷
*/
--AFTER SERVERERROR trigger
/*
ÒÔÏÂerror ²»»á´¥·¢
ORA-00600 oracleÄÚ²¿´íÎó
ORA-01034 oracleÎÞ·¨Ê¹ÓÃ
ORA-01403 ûÓвéѯµ½Êý¾Ý
ORA-01422 ·µ»Ø¶àÐÐÊý¾Ý
ORA-01423
ORA-04030
--´¥·¢Æ÷²»»áÐÞ¸´´íÎó
--ÄÚ½¨º¯Êý»ñÈ¡Òì³£ÐÅÏ¢
ora_server_error(index) ·µ»Øerror number£¬ÕÒ²»µ½·µ»Ø0
ora_is_servererror(number) error numberÊÇ·ñÔÚÒì³£stackÖУ¬Ò²¾ÍÊÇÅжϵ±Ç°Òì³£ÊÇ·ñ°üº¬Ö¸¶¨Òì³£
ora_server_error_depth Òì³£ÖÐerrorµÄÊýÁ¿
ora_server_error_msg(index) ´íÎóÐÅÏ¢
...
*/
CREATE OR REPLACE TRIGGER error_echo
AFTER SERVERERROR ON SCHEMA
DECLARE
num number := SQLCODE;
BEGIN
FOR i IN 1..ora_server_error_depth LOOP
dbms_output.put_line('´íÎóÂ룺'||ora_server_error(i));
dbms_output.put_line('´íÎóÐÅÏ¢£º'||ora_server_error_msg(i));
END LOOP;
END;
/*
CREATE OR REPLACE TRIGGER ddl_echo
AFTER DDL ON SCHEMA
BEGIN
dbms_output.put_line(SQLCODE);
IF ora_is_servererror(SQLCODE) THEN
dbms_output.put_line('error:'||sqlerrm);
ELSE
dbms_output.put_line('OK:'||sqlerrm);
END IF;
END;
*/
--¼ìÑéerror_echo´¥·¢Æ÷¹¦ÄÜ
create table t_t(t number);
drop table t_t;
commit;
insert into t_t values('xx');--»áÓÐÒì³££¬±»´òÓ¡³ö
--ά»¤´¥·¢Æ÷
--²é¿´´¥·¢Æ÷ÐÅÏ¢
--user_triggers Êý¾Ý×ÖµäÊÓͼ,»ù±¾ÉÏÄÒÀ¨ÁË´¥·¢Æ÷¶¨ÒåÊÇËùÓÃÐÅÏ¢
select * from user_triggers;
--µ±Ç°Óû§ÓÐȨÏ޲鿴µ½µÄËùÓд¥·¢Æ÷
select * from all_triggers;
--ʹ´¥·¢Æ÷ʧЧ
ALTER TRIGGER trigger_name DISABLE;
--´Óм¤»î´¥·¢Æ÷
ALTER TRIGGER trigger_name ENABLE;
--Õë¶Ôij¸ö±í
--½ûÖ¹ËùÓеĴ¥·¢Æ÷
ALTER TABLE table_name DISABLE ALL TRIGGERS;
--¼¤»îËùÓÐ
ALTER TABLE table_name ENABLE ALL TRIGGERS£»
--´ÓбàÒë´¥·¢Æ÷
ALTER TRIGGER trigger_name COMPILE;
--ɾ³ý´¥·¢Æ÷
DROP TRIGGER trigger_name;
/*
reference:
http://download.o