oracle 触发器锁表,关于oracle触发器锁表问题-20081218

今天测试关于触发器问题,把更改的数据保存到另一个表。这个比较简单。

---------------------

CREATE TABLE EMP(

empno NUMBER(10) PRIMARY KEY,

ename VARCHAR2(10) NOT NULL,

job VARCHAR2(10),

sal NUMBER(10)

);

---------------------------

CREATE TABLE logs(

LOG_ID NUMBER(10) PRIMARY KEY,

LOG_TABLE VARCHAR2(10) NOT NULL,

LOG_DML VARCHAR2(10),

LOG_KEY_ID NUMBER(10),

LOG_DATE DATE,

LOG_USER VARCHAR2(15)

);

-----------------------

CREATE SEQUENCE logs_id_squ INCREMENT BY 1

START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;

----------------------

CREATE OR REPLACE TRIGGER DML_LOG

BEFORE --触发时间为操作前

DELETE OR INSERT OR UPDATE -- 由三种事件触发

ON emp

FOR EACH ROW -- 行级触发器

DECLARE tNAME_TEMP VARCHAR2(10) ;

BEGIN

select  ename into tNAME_TEMP from emp where empno = :new.empno;

if(!tNAME_TEMP.equls(xxxx)) then

IF INSERTING THEN

INSERT INTO logs   VALUES(logs_id_squ.NEXTVAL,'EMP','INSERT',:new.empno,SYSDATE,USER);

ELSIF DELETING THEN

INSERT INTO logs   VALUES(logs_id_squ.NEXTVAL,'EMP','DELETE',:old.empno,SYSDATE,USER);

ELSE

INSERT INTO logs   VALUES(logs_id_squ.NEXTVAL,'EMP','UPDATE',:new.empno,SYSDATE,USER);

END IF;

END;

可以操作。

后来,有位哥们提出一个问题。就是在同一个表里面备份原来数据

写的测试如下。我知道这样会有问题,只是想试着找条出路出路

CREATE TABLE EMP (

ENO NUMBER(10) NOT NULL PRIMARY KEY ,

ENAME VARCHAR(20) NOT NULL,

EJOB VARCHAR(20) ,

ENAMEB VARCHAR(20)   ---如果ename改变了,备份原来的ename到enameb

);

CREATE SEQUENCE logs_id_squ INCREMENT BY 1

START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;

CREATE TABLE logs(

LOG_ID NUMBER(10) PRIMARY KEY,

LOG_TABLE VARCHAR2(10) NOT NULL,

LOG_DML VARCHAR2(10),

LOG_KEY_ID NUMBER(10),

LOG_NAME_NEW VARCHAR(20),

LOG_DATE DATE,

LOG_USER VARCHAR2(15)

);

INSERT INTO EMP VALUES (8001,'B','JOB1','') ;

COMMIT ;

SELECT * FROM EMP ;

-------------------------------

CREATE OR REPLACE TRIGGER DML_LOG BEFORE DELETE OR INSERT OR UPDATE ON emp

FOR EACH ROW

BEGIN

IF INSERTING THEN

INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','INSERT',:new.eno,:new.ename,SYSDATE,USER);

ELSIF DELETING THEN

update emp set enameb = :old.ename where eno = :old.eno ;

INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','DELETE',:old.eno,:old.ename,SYSDATE,USER);

ELSE

IF :new.ename<>:old.ename then

update emp set enameb = :old.ename where eno = :old.eno ;

INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','UPDATE',:old.eno,:old.ename,SYSDATE,USER);

ELSE

INSERT INTO logs VALUES(logs_id_squ.NEXTVAL,'EMP','UPDATE',:old.eno,:old.ename,SYSDATE,USER);

END IF;

END IF;

END;

----------------------------------

select * from emp ;

select * from logs ;

update emp set ejob = 'job2' where eno = '8001' ;

update emp set ename = 'C' where eno = '8001' ;

delete emp where eno = '8001'

发现果然不通过,锁起emp表不让进行操作。不过,如果我想改应该怎么办呢??留下这个问题,等待解决吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值