`
ybyonline
  • 浏览: 40153 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

触发器使用

SUN 
阅读更多

触发器的使用

 

 

触发器什么时候出发呢?

 

BEFORE:在触发的DML事件发生之前执行触发器体

AFTER:在触发的DML事件发生之后执行触发器体

INSTEAD OF:执行触发器体来代替触发器事件,用于不可修改 的视图中。

 

一、语句级的触发器

  • 触发事件发生一次,触发器体便执行一次。
  • 即使没有任何记录受到影响也会触发一次。
1.触发器格式

   CREATE [OR REPLACE] TRIGGER trigger_name
		timing
			event1 [OR event2 OR event3 ]
				ON table_name
		trigger_body
 

2.创建一个语句级触发器

 

    判断更新操作是否在忙时('08:00' 到 '18:00')!如果是的话提示错误!

 

	CREATE OR REPLACE TRIGGER secure_emp
	BEFORE INSERT OR UPDATE ON emp
	BEGIN
		IF(T0_CHAR(SYSDATE,'DD') IN ('SAT','SUN')) OR     TO_CHAR(SYSDATE,'HH24:MI') 
			NOT BETWEEN '08:00' AND '18:00'
		THEN
			RAISE_APPLICATION_ERROR(-20500,'YOU MAY INSERT INTO THE EMP
			TABLE ONLY DURING BUSINESS HOURS.');
		END IF;
	END;

 

   
3.判定触发器语句
  可以使用一下谓词来确定触发器的语句类型。
UPDATING
INSERTING
DELETING
  格式:

	...
		IF UPDATING THEN 
	v_stmt:='UPDATE';
		ELSIF DELETING THEN 
	v_stmt:='DELETE'
	...
 

二、记录级的触发器
  • 对于每一条被触发事件影响的记录,触发器体便执行一次。
  • 如果触发器事件未影响任何记录,触发器将不会执行。

1、创建一个记录级触发器

 

创建格式:如下

 

	CREATE [OR REPLACE] TRIGGER trigger_name
		timing
			event1 [OR event2 OR event3	]
				ON table_name
		[REFERENCINT OLD AS old | NEW AS new]
	FOR EACH ROW
		[WHEN (condition)]
	trigger_body

 

具体事例:

 

	CREATE OR REPLACE TRIGGER restrict_salary
	BEFORE  INSERT OR UPDATE  OF sal  ON emp
	FOR EACH ROW 
	BEGIN
		IF(:NEW.job IN ('CLERK','SALESMAN'))  AND  :NEW.sal  > 5000
		THEN 
			RAISE_APPLICATION_ERROR(-20201,
			'EMPLOYEE CANNOT  EARN THIS AMOUNT.')
		END  IF;
	END;
 

三、INSTEAD OF 触发器

 

创建格式:

 

 

	CREATE [OR REPLACE] TRIGGER trigger_name
		INSTEAD OF 
			event! [OR event2 OR event3	]
				ON view_name
			[REFERENCE OLD AS old | NEW  AS new ]
			FOR EACH  ROW
		trigger_body
 

 

四、管理触发器

 

1、禁用或重新启用一个数据库触发器

 

ALTER TRIGGER trigger_name DISABLE | ENABLE;

  

2、禁用或重新启用一个表上的所有触发器

 

ALTER TABLE table_name DISABLE | ENABLE ALL ALL TRIGGERS;

 

3、重编译一张表上的触发器

 

ALTER TRIGGER my_trigger  COMPILE;

 

4、删除触发器

 

DROP TRIGGER trigger_name;

 

五、数据库触发器

 

暂无

 

六、触发器的限制

 

触发器不能:

 

执行DDL语句

执行COMMIT,ROLLBACK,SAVEPOINT语句(数据库触发器除外)

 

查看触发器信息:

包含触发器信息的数据字典:

USER_OBJECTS

USER_TRIGGERS

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics