技术开发 频道

ORACLE PL/SQL编程之八:把触发器说透

  例1:创建触发器,存放有关事件信息。

 DESC ora_sysevent

  DESC ora_login_user

  
--创建用于记录事件用的表

  CREATE TABLE ddl_event

  (crt_date timestamp PRIMARY KEY,

  event_name VARCHAR2(
20),

  user_name VARCHAR2(
10),

  obj_type VARCHAR2(
20),

  obj_name VARCHAR2(
20));

  
--创建触犯发器

  CREATE
OR REPLACE TRIGGER tr_ddl

  AFTER DDL
ON SCHEMA

  BEGIN

  INSERT INTO ddl_event VALUES

  (systimestamp,ora_sysevent, ora_login_user,

  ora_dict_obj_type, ora_dict_obj_name);

  
END tr_ddl;


  例2:创建登录、退出触发器。

CREATE TABLE log_event

  (user_name VARCHAR2(
10),

  address VARCHAR2(
20),

  logon_date timestamp,

  logoff_date timestamp);

  
--创建登录触发器

  CREATE
OR REPLACE TRIGGER tr_logon

  AFTER LOGON
ON DATABASE

  BEGIN

  INSERT INTO log_event (user_name, address, logon_date)

  VALUES (ora_login_user, ora_client_ip_address, systimestamp);

  
END tr_logon;

  
--创建退出触发器

  CREATE
OR REPLACE TRIGGER tr_logoff

  BEFORE LOGOFF
ON DATABASE

  BEGIN

  INSERT INTO log_event (user_name, address, logoff_date)

  VALUES (ora_login_user, ora_client_ip_address, systimestamp);

  
END tr_logoff;

  8.2.5 使用触发器谓词

谓词行为

INSERTING

如果触发语句是 INSERT 语句,则为TRUE,

  ORACLE 提供三个参数INSERTING, UPDATING, DELETING 用于判断触发了哪些操作。

  8.2.6 重新编译触发器

  如果在触发器内调用其它函数或过程,当这些函数或过程被删除或修改后,触发器的状态将被标识为无效。当DML语句激活一个无效触发器时,ORACLE将重新编译触发器代码,如果编译时发现错误,这将导致DML语句执行失败。

  在PL/SQL程序中可以调用ALTER TRIGGER语句重新编译已经创建的触发器,格式为:

  ALTER TRIGGER [schema.] trigger_name COMPILE [ DEBUG] 其中:DEBUG 选项要器编译器生成PL/SQL 程序条使其所使用的调试代码。

  8.3 删除和使能触发器

  删除触发器:

  DROP TRIGGER trigger_name;当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER系统权限,当删除建立在数据库上的触发器时,用户需要具有ADMINISTER DATABASE TRIGGER系统权限。

  此外,当删除表或视图时,建立在这些对象上的触发器也随之删除。

  禁用或启用触发器

  数据库TRIGGER 的状态:

  有效状态(ENABLE):当触发事件发生时,处于有效状态的数据库触发器TRIGGER 将被触发。

  无效状态(DISABLE):当触发事件发生时,处于无效状态的数据库触发器TRIGGER 将不会被触发,此时就跟没有这个数据库触发器(TRIGGER) 一样。

  数据库TRIGGER的这两种状态可以互相转换。格式为:

 ALTER TIGGER trigger_name [DISABLE | ENABLE ];

  --例:ALTER TRIGGER emp_view_delete DISABLE;

  ALTER TRIGGER语句一次只能改变一个触发器的状态,而ALTER TABLE语句则一次能够改变与指定表相关的所有触发器的使用状态。格式为:

ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS;

  --例:使表EMP 上的所有TRIGGER 失效:

 ALTER TABLE emp DISABLE ALL TRIGGERS;

  8.4 触发器和数据字典

  相关数据字典:

  USER_TRIGGERS、ALL_TRIGGERS、DBA_TRIGGERS

  
SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT,

  TABLE_OWNER, BASE_OBJECT_TYPE, REFERENCING_NAMES,

  STATUS, ACTION_TYPE

  FROM user_triggers;
0
相关文章