重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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的权限才行
检测的话,你可以查询两个a、b表的数据量来印证。
触发器没有运行日志,需要自己去添加。
就是自己在触发器里面写数据到日志表(需要自己创建)里面。
oracle判断为空是用is
null不是=null;
在oracle中=null一直都是返回false的。
另外最好加上exception判断:
IF
:new.s_ID
IS
NULL
THEN
BEGIN
SELECT
c_id
into
:new.s_ID
from
classs
where
c_sid=:NEW.s_cid;
EXCEPTION
WHEN
no_data_found
THEN
SELECT
INTO
:new.s_ID
FROM
dual;
--或者其他操作
END;
END
IF;
当在classs表中没有找到对应的记录时不至于出错,看你要怎么设计咯。
select * from dba_triggers where owner=用户名;查看这个用户的所有触发器
select * from dba_constraints T where owner=用户名 AND T.CONSTRAINT_TYPE='F';查看这个用户中所有的外键约束,table_name显示了建立在哪个表上
select * from user_objects where object_name = trigger_name and status='INVALID'
甲骨文股份有限公司(NASDAQ:ORCL,Oracle)是全球大型数据库软件公司。总部位于美国加州红木城的红木岸(Redwood Shores),现时首席执行官为公司创办人劳伦斯·埃里森(Lawrence J. Ellison)。
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。