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#'

posted @ 2022-11-26 16:53  oioele  阅读(411)  评论(0)    收藏  举报