Oracle 触发器及死锁处理
--创建触发器 --FOR EACH ROW 代表行级触发器 --:NEW 代表操作完成后列的值 --:OLD 代表操作前列的值 --INTO 用于赋值给变量 --BEFORE|AFTER 触发器的触发时间是前触发还是后触发 CREATE OR REPLACE TRIGGER tr_del_check BEFORE DELETE ON T_AAA_TABLE FOR EACH ROW DECLARE fid varchar2 (128); detail_count NUMBER; BEGIN CASE WHEN DELETING THEN fid:=:OLD.FID; SELECT COUNT(1) INTO detail_count FROM T_BBB_TABLE where FBILLID = FID; IF detail_count > 1 THEN RAISE_APPLICATION_ERROR(-20600,'BBB表数据未删除,不能删除调动单!'); END IF; END CASE; END;
CREATE OR REPLACE TRIGGER tr_add_check
BEFORE INSERT ON T_BBB_TABLE
FOR EACH ROW
BEGIN
CASE
WHEN inserting THEN
IF :NEW.FNAME IS NULL THEN
RAISE_APPLICATION_ERROR(-20600,'附件名称不能为空,请联系管理员!');
END IF;
END CASE;
END;
--删除触发器 drop trigger tr_del_check --查询数据表上的触发器,表明要全大写 select * from all_triggers WHERE table_name='T_AAA_TABLE'
--查询发生死锁的select语句
SQL> select sql_text from v$sql where hash_value in ( select sql_hash_value from v$session where sid in (select session_id from v$locked_object))
--查询死锁会话信息
SQL> select sid,serial# from v$session where sid in (select session_id from v$locked_object)
--杀掉对应会话即解锁
SQL> alter system kill session 'sid,serial#'