oracle触发器
2015-11-10 21:24
387 查看
--触发器
--执行顺序:前语句触发->前行级触发->后行级触发->后语句触发
--instead of 类型的触发器主要解决视图的不可更新问题,比如多表关联或者group by语句 的,或者通过函数生成的复杂视图不可更新
CREATE TRIGGER tri_del
AFTER DELETE
ON jobs
BEGIN
IF deleting THEN
dbms_output.put_line('删除数据操作!');
END IF;
END;
/
SELECT * FROM user_source WHERE NAME='TRI_DEL' ORDER BY line;
SELECT * FROM log_tab;
--创建序列
CREATE SEQUENCE log_tab_id
MINVALUE 100000000
MAXVALUE 999999999
START WITH 100000000
INCREMENT BY 1
/
--创建触发器,如果向表jobs中插入数据,就向日志表中进行记录
CREATE TRIGGER job_oper_tri
BEFORE INSERT
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
IF inserting THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('插入数据的主键:'||:new.job_id);
END IF;
END;
/
--下面两条语句是针对上述两个触发器进行测试的语句
INSERT INTO jobs VALUES('123','ceshi','1000','2000');
UPDATE jobs SET job_title='update' WHERE job_id='123';
DELETE FROM jobs WHERE job_id='123';
---使用多种触发事件,:new和:old表示在行级触发中来访问变更前后的数据
CREATE TRIGGER job_oper
BEFORE INSERT OR UPDATE OR DELETE
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
CASE
WHEN inserting THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('插入数据的主键:'||:new.job_id);
WHEN updating THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('修改数据的主键:'||:old.job_id);
WHEN deleting THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('删除数据的主键:'||:old.job_id);
END CASE;
END;
/
SELECT * FROM jobs;
--触发器中使用if语句
CREATE TRIGGER job_if
BEFORE UPDATE OF MIN_SALARY ON jobs
FOR EACH ROW
BEGIN
IF(TO_CHAR(SYSDATE,'dd')=27 AND OLD:MIN_SALARY>2000)THEN
raise_application_error(-20000,'今天是27号,不允许修改最低工资2000以上的数据!');
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
END IF;
dbms_output.put_line('数据修改完成,主键是:'||:old.job_id);
END;
/
--触发器也可以进行级联修改,再操作中可以更新,插入,删除操作同时做
--DDL触发器
CREATE TRIGGER job_ddl
BEFORE CREATE OR UPDATE OR DROP OR RENAME ON schema
BEGIN
IF sysevent ='create' THEN
dbms_output.put_line(dictionary_obj_name||'创建中...');
elseif sysevent ='drop' THEN
IF dictionary_obj_name='TEST' THEN
raise_application_error(-20000,'不允许删除表');
END IF;
elseif sysevent='alter' THEN
raise_application_error(-20000,'不允许修改表');
END IF;
END;
/
--系统触发器,级别是数据库级别,该触发器用于记录每个用户登陆的时间
CREATE TRIGGER logon_tgr
AFTER
LOGIN
ON
DATABASE
BEGIN
INSERT INTO log_user VALUES(log_tab_id.nextval,sys.login_user,SYSDATE);
END;
/
--执行顺序:前语句触发->前行级触发->后行级触发->后语句触发
--instead of 类型的触发器主要解决视图的不可更新问题,比如多表关联或者group by语句 的,或者通过函数生成的复杂视图不可更新
CREATE TRIGGER tri_del
AFTER DELETE
ON jobs
BEGIN
IF deleting THEN
dbms_output.put_line('删除数据操作!');
END IF;
END;
/
SELECT * FROM user_source WHERE NAME='TRI_DEL' ORDER BY line;
SELECT * FROM log_tab;
--创建序列
CREATE SEQUENCE log_tab_id
MINVALUE 100000000
MAXVALUE 999999999
START WITH 100000000
INCREMENT BY 1
/
--创建触发器,如果向表jobs中插入数据,就向日志表中进行记录
CREATE TRIGGER job_oper_tri
BEFORE INSERT
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
IF inserting THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('插入数据的主键:'||:new.job_id);
END IF;
END;
/
--下面两条语句是针对上述两个触发器进行测试的语句
INSERT INTO jobs VALUES('123','ceshi','1000','2000');
UPDATE jobs SET job_title='update' WHERE job_id='123';
DELETE FROM jobs WHERE job_id='123';
---使用多种触发事件,:new和:old表示在行级触发中来访问变更前后的数据
CREATE TRIGGER job_oper
BEFORE INSERT OR UPDATE OR DELETE
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
CASE
WHEN inserting THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('插入数据的主键:'||:new.job_id);
WHEN updating THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('修改数据的主键:'||:old.job_id);
WHEN deleting THEN
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
dbms_output.put_line('删除数据的主键:'||:old.job_id);
END CASE;
END;
/
SELECT * FROM jobs;
--触发器中使用if语句
CREATE TRIGGER job_if
BEFORE UPDATE OF MIN_SALARY ON jobs
FOR EACH ROW
BEGIN
IF(TO_CHAR(SYSDATE,'dd')=27 AND OLD:MIN_SALARY>2000)THEN
raise_application_error(-20000,'今天是27号,不允许修改最低工资2000以上的数据!');
INSERT INTO log_tab VALUES(
log_tab_id.nextval,
'jobs',
'insert',
:new.job_id,
SYSDATE
);
END IF;
dbms_output.put_line('数据修改完成,主键是:'||:old.job_id);
END;
/
--触发器也可以进行级联修改,再操作中可以更新,插入,删除操作同时做
--DDL触发器
CREATE TRIGGER job_ddl
BEFORE CREATE OR UPDATE OR DROP OR RENAME ON schema
BEGIN
IF sysevent ='create' THEN
dbms_output.put_line(dictionary_obj_name||'创建中...');
elseif sysevent ='drop' THEN
IF dictionary_obj_name='TEST' THEN
raise_application_error(-20000,'不允许删除表');
END IF;
elseif sysevent='alter' THEN
raise_application_error(-20000,'不允许修改表');
END IF;
END;
/
--系统触发器,级别是数据库级别,该触发器用于记录每个用户登陆的时间
CREATE TRIGGER logon_tgr
AFTER
LOGIN
ON
DATABASE
BEGIN
INSERT INTO log_user VALUES(log_tab_id.nextval,sys.login_user,SYSDATE);
END;
/
相关文章推荐
- oracle函数大全
- 20151110 oracle事务 redo undo
- oracle的内置函数
- oracle用户创建及权限设置
- Oracle 通过sql profile为sql语句加hint
- with as与hint materialize的使用
- Oracle ORA-02020 : 过多的数据库链接
- Oracle自增列创建方法
- cmd下给oracle创建用户
- ORACLE数据库 数据文件转移
- Oracle高级查询之OVER (PARTITION BY ..)
- Oracle中查看所有的表,用户表,列名,主键,外键
- Oracle中主键、外键、索引、序列、唯一性约束的创建
- oracle 11g 锁分类(lock)
- Oracle中给表主键、外键收集
- Oracle创建主外键
- oracle修改字符集----转载自Linux公社
- Oracle笔记--Sql语句
- oracle 11g 审计
- oracle与木桶原理