触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。
简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
语法:
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW] --说明创建的是行级触发器
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
CREATE [OR REPLACE] TRIGGER trigger_name: 创建或替换现有的触发器:trigger_name
{BEFORE | AFTER | INSTEAD OF} : 指定触发时间。在INSTEAD OF子句用于在视图中创建触发器
{INSERT [OR] | UPDATE [OR] | DELETE}: 指定触发事件:指明哪些数据库动作会触发此触发器:
[OF col_name]: 指定将被更新的列名
[ON table_name]: 指定触发器相关联的表的名称
[REFERENCING OLD AS o NEW AS n]: 可以参考新旧值的各种DML语句,如INSERT,UPDATE和DELETE
:new 行变量:保存事件发生时新数据所在行,只有insert事件和update事件才有新数据。
:old 行变量:保存事件发生时旧数据所在行,只有delete事件和update事件才有旧数据。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
FOR EACH STATEMENT:语句级触发
WHEN (condition): 触发器将触发的条件。此子句仅适用于行级触发器有效
触发器能实现如下功能:
自动生成一些派生列值
实施参照完整性
事件日志和对表的访问存储信息
审计
表的同步复制
实行安全许可
防止非法交易
SELECT * FROM USER_TRIGGERS;
--必须以DBA身份登陆才能使用此数据字典
SELECT * FROM ALL_TRIGGERS;SELECT * FROM DBA_TRIGGERS;
--启用和禁用
ALTER TRIGGER trigger_name DISABLE;
ALTER TRIGGER trigger_name ENABLE;