概述
一、基本知识
1、触发一个触发器的事件:
DML语句:修改表中的数据
DDL语句:create、drop一个数据对象,只能用在一个schema或者数据库上。
SYSTEM EVENTS:startyp shutdown
USER EVENTS:logon logoff
2、触发器的主要作用:
提高数据库系统的一致性,增强复杂的业务逻辑,oracle推荐在不能使用以下的完整性约束来解决问题时:
not null,unique,primary key,foreign key, check ,delete cascade,delete set null
提高数据库系统的一致性,增强复杂的业务逻辑,oracle推荐在不能使用以下的完整性约束来解决问题时:
not null,unique,primary key,foreign key, check ,delete cascade,delete set null
3、触发器的类型:
行触发器和语句触发器
before和after触发器
instead of 触发器
4、trigger 是自动提交的,不用COMMIT,ROLLBACK
行触发器和语句触发器
before和after触发器
instead of 触发器
4、trigger 是自动提交的,不用COMMIT,ROLLBACK
5、trigger最大为32K,如果有复杂的应用可以通过在TRIGGER里调用PROCEDURE或FUNCTION来实现。
二、语法及事例
6、语法CREATE OR REPLACE TRIGGER
ON
ON
DECLARE
BEGIN
EXCEPTION
END ;
/
BEGIN
EXCEPTION
END ;
/
7、 相关命令
create trigger
create any trigger
administer database trigger
alter any trigger
drop any trigger
8、对列做触发(of)(行的触发是最常见的,不在这里列出
create trigger
create any trigger
administer database trigger
alter any trigger
drop any trigger
8、对列做触发(of)(行的触发是最常见的,不在这里列出
1 create or replace trigger tri_wwm
2 before update of id on wwm2 for each row
3 declare the_str VARCHAR2(40):='update on wwm2''s id column';
4 begin
5 dbms_output.put_line(the_str);
6* end tri_wwm;
SQL> /
2 before update of id on wwm2 for each row
3 declare the_str VARCHAR2(40):='update on wwm2''s id column';
4 begin
5 dbms_output.put_line(the_str);
6* end tri_wwm;
SQL> /
Trigger created.
SQL> update wwm2 set id=3;
update on wwm2's id column
update on wwm2's id column
1 row updated.
9、Referencing 别名
测试数据
CREATE TABLE TEST
(
SITENAME VARCHAR2(40 BYTE),
SITETITLE VARCHAR2(100 BYTE),
SITEKEYWORDS VARCHAR2(100 BYTE),
SITEAUTHOR VARCHAR2(65 BYTE),
WEBMASTER VARCHAR2(20 BYTE),
WEBMASTERQQ VARCHAR2(20 BYTE),
WEBMASTEREMAIL VARCHAR2(60 BYTE),
REGSTATUS VARCHAR2(5 BYTE),
SITEBROADCAST VARCHAR2(2000 BYTE)
)
CREATE TABLE TEST
(
SITENAME VARCHAR2(40 BYTE),
SITETITLE VARCHAR2(100 BYTE),
SITEKEYWORDS VARCHAR2(100 BYTE),
SITEAUTHOR VARCHAR2(65 BYTE),
WEBMASTER VARCHAR2(20 BYTE),
WEBMASTERQQ VARCHAR2(20 BYTE),
WEBMASTEREMAIL VARCHAR2(60 BYTE),
REGSTATUS VARCHAR2(5 BYTE),
SITEBROADCAST VARCHAR2(2000 BYTE)
)
CREATE TABLE TSTATIONINFO
(
SITENAME VARCHAR2(40 BYTE),
SITETITLE VARCHAR2(100 BYTE),
SITEKEYWORDS VARCHAR2(100 BYTE),
SITEAUTHOR VARCHAR2(65 BYTE),
WEBMASTER VARCHAR2(20 BYTE),
WEBMASTERQQ VARCHAR2(20 BYTE),
WEBMASTEREMAIL VARCHAR2(60 BYTE),
REGSTATUS VARCHAR2(5 BYTE) DEFAULT 1,
SITEBROADCAST VARCHAR2(2000 BYTE)
)
需求:
当把TSTATIONINFO中一条数据删除前,如果test表中也存在的情况下,删除之,建立以下触发器:
CREATE OR REPLACE TRIGGER HHH
BEFORE DELETE
ON TSTATIONINFO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
delete from test where sitename=:old.sitename; ----注意此时是用old
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hhh;
/
当把TSTATIONINFO中一条数据删除前,如果test表中也存在的情况下,删除之,建立以下触发器:
CREATE OR REPLACE TRIGGER HHH
BEFORE DELETE
ON TSTATIONINFO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
delete from test where sitename=:old.sitename; ----注意此时是用old
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hhh;
/
当向TEST表中插入一条数据时,检测表TSTATIONINFO,如果不存在就增加一条,如果存在就算拉。
CREATE OR REPLACE TRIGGER insert_row
BEFORE INSERT
ON TEST
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
tmpVar NUMBER;
BEFORE INSERT
ON TEST
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
tmpVar NUMBER;
BEGIN
tmpVar := 0;
select count(*) into tmpVar from TSTATIONINFO where sitename=:new.sitename; ---注意此时使用new
if tmpVar=0 then
insert into TSTATIONINFO (sitename) values (:new.sitename);
end if;
END insert_row;
/
tmpVar := 0;
select count(*) into tmpVar from TSTATIONINFO where sitename=:new.sitename; ---注意此时使用new
if tmpVar=0 then
insert into TSTATIONINFO (sitename) values (:new.sitename);
end if;
END insert_row;
/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/77580/viewspace-212768/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/77580/viewspace-212768/
最后
以上就是安静柚子为你收集整理的TRIGGER应用示例的全部内容,希望文章能够帮你解决TRIGGER应用示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复