oracle数据库触发器 Oracle 中的触发器有几种
大家好,感谢邀请,今天来为大家分享一下oracle数据库触发器的问题,以及和Oracle 中的触发器有几种的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
Oracle 中的触发器有几种
ORACLE数据库有四种触发器,分别是DML、Instead-of、DDL、DB触发器,一般的应用系统中都是用到DML、Instead-of触发器,DDL、DB两种触发器是DBA管理数据库用得比较多
四种触发器分别有不同的作用
一、DML触发器:当发出UPDATE、INSERT、DELETE命令就可以触发已定义好的DML触发器,是最简单和常用的一种触发器
语法:
create or replace trigger trigger_name
after|before insert|update|delete
on table_name
for each row
二、Instead-of触发器:当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作),语法是这样的:
create or replace trigger trigger_name
instead of insert|update|delete
on view_name
for each row
三、DDL触发器:当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化
语法:
create or replace trigger trigger_name
before|after create|alter|drop|truncate
on schema|database
例:
--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用户的对象
create or replace trigger apps_no_ddl
before create or alter or drop or truncate
on apps
begin
raise_application_error(-20001,'不允许用DDL操作APPS用户的对象');
end;
四、DB事件触发器:当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况
语法:
create or replace trigger trigger_name
before|after startup|shutdown|logon|logoff
on database
例:
--记录数据库关闭的时间(shutdown类型要用关键字before,startup用after)
create or replace trigger db_shutdown
before shutdown
on database
begin
insert into test_tbl(log_event) values('db shutdown at'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
--记录用户LOGON时间(logoff类型要用关键字before,logon用after)
create or replace trigger user_logon_db
after logon
on database
begin
insert into test_tbl(username,logon_time) values(user,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
注意:要创建DDL和DB事件这两种触发器必须要有DBA的权限才行
oracle中触发器都有几种
oracle中触发器有三种
1.DML触发器
ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
2.替代触发器
由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。
3.系统触发器
ORACLE 8i提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
oracle数据库如何创建触发器实例
Oracle DBA Studio工具里面就能创建触发器 CREATE TRIGGER名称 CREATE TRIGGER创建一个新触发器语法 CREATE TRIGGER name{ BEFORE| AFTER}{ event [OR...]} ON table FOR EACH{ ROW| STATEMENT} EXECUTE PROCEDURE func( arguments)输入 n
Oracle DBA Studio工具里面就能创建触发器
CREATE TRIGGER
名称
CREATE TRIGGER—创建一个新触发器
语法
CREATE TRIGGER name{ BEFORE| AFTER}{ event [OR...]}
ON table FOR EACH{ ROW| STATEMENT}
EXECUTE PROCEDURE func( arguments)
输入
name
触发器名称.
table
表名称.
event
INSERT,DELETE或 UPDATE之一.
funcname
一个用户提供的函数.
输出
CREATE
如果触发器成功创建,返回此信息.
描述
CREATE TRIGGER将向现有数据库中增加一个新的触发器.触发器将与表 table相联并且将执行声明的函数 funcname.
触发器可以声明为在对记录进行操作之前(在检查约束之前和 INSERT,UPDATE或 DELETE执行前)或之后(在检查约束之后和完成了 INSERT,UPDATE或 DELETE操作)触发.如果触发器在事件之前,触发器可能略过当前记录的操作或改变被插入的(当前)记录(只对 INSERT和 UPDATE操作有效).如果触发器在事件之后,所有更改,包括最后的插入,更新或删除对触发器都是"可见"的.
请参考 PostgreSQL程序员手册中SPI和触发器章节获取更多信息.
注意
CREATE TRIGGER是一个 Postgres语言扩展.
只有表所有者可以就此表创建一个触发器.
在当前的版本(v7.0),STATEMENT触发器还没有实现.
请参考 DROP TRIGGER获取如何删除触发器的信息.
用法
在插入或更新表 films之前检查一下声明的分销商代码是否存在于 distributors表中:
CREATE TRIGGER if_dist_exists
BEFORE INSERT OR UPDATE ON films FOR EACH ROW
EXECUTE PROCEDURE check_primary_key('did','distributors','did');
在删除或更新一个分销商的内容之前,将所有记录移到表 films中(译注:好象与例子意义不同):
CREATE TRIGGER if_film_exists
BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
EXECUTE PROCEDURE check_foreign_key(1,'CASCADE','did','films','did');
兼容性
SQL92
在 SQL92里没有 CREATE TRIGGER语句.
上面第二个例子可以使用一个 FOREIGN KEY约束实现:
CREATE TABLE distributors(
did DECIMAL(3),
name VARCHAR(40),
CONSTRAINT if_film_exists
FOREIGN KEY(did) REFERENCES films
ON UPDATE CASCADE ON DELETE CASCADE
);
实例
Oracle中触发器有几种,用法与SQL Server一样吗谢谢
ORACLE触发器有以下两类:
1
语句级(Statement-level)触发器,在CREATE
TRIGGER语句中不包含FOR
EACH
ROW子句。语句级触发器对于触发事件只能触发一次,
而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行
2
行级(Row-level)触发器,在CREATE
TRIGGER语句中包含FOR
EACH
ROW子句。行级触发器可对受触发器影响的每一行触发,并且能
够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。
SQL
Server支持两种类型的触发器:
AFTER
触发器和INSTEAD
OF
触发器。其中AFTER
类型触发器要求只有执行某一操作(INSERT
UPDATE
DELETE)
之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER
触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder
来完成此任务。
INSTEAD
OF
触发器表示并不执行其所定义的操作(INSERT、
UPDATE、
DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD
OF
触发器,也可以在视图上定义INSTEAD
OF
触发器,但对同一操作只能定义一个INSTEAD
OF
触发器。
好了,文章到此结束,希望可以帮助到大家。