您的位置:首页 > 数据库 > Oracle

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;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: