一个关于触发器的问题~~

kbkingbird 2002-05-30 12:11:34
这是创建的一个表
CREATE TABLE STUD_jk99327(
XH CHAR(7) PRIMARY KEY,XM CHAR(8),
CSNY DATE,JG VARCHAR2(20),
DNO CHAR(3) REFERENCES DEPT_jk99327(DNO)
);

如今有一个触发器
CREATE OR REPLACE TRIGGER STUD_TRG_jk99327
BEFORE INSERT OR UPDATE OR DELETE ON STUD_jk99327
FOR EACH ROW
BEGIN
/* 插入 */
IF INSERTING THEN
INSERT INTO ST_jk99327 VALUES(:NEW.XH,:NEW.XM,(SYSDATE-:NEW.CSNY)/365);
END IF;
/* 修改 *
IF UPDATING THEN
DELETE FROM ST_jk99327 WHERE XH=:OLD.XH;
INSERT INTO ST_jk99327
VALUES(:NEW.XH,:NEW.XM,(SYSDATE-:NEW.CSNY)/365);
END IF;
/* 删除 */
IF DELETING THEN
DELETE FROM ST_jk99327 WHERE XH=:OLD.XH;
END IF;
END;/

现在问题是:
如果在STUD_jk99327中不允许修改XH,触发器将怎样改进?

谢谢~~由于才接触oracle,所以不是太了解~~大家有什么关于这方面的书推荐一下啊~~

...全文
74 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbkingbird 2002-05-30
  • 打赏
  • 举报
回复
但是题目是要不修改xh啊~
怎么该?
mycode 2002-05-30
  • 打赏
  • 举报
回复
修改xh,只需要用
:New.xh := New_Value;
就可以了,也就修改了xh的值.
kbkingbird 2002-05-30
  • 打赏
  • 举报
回复
谢谢了~~
wjfxiao 2002-05-30
  • 打赏
  • 举报
回复
IF :NEW.XH <> NEW_VALUE THEN
REISE_APPLICATION_ERROR(...);错误时显示的信息

看看Oracle8 pl/sql程序设计
Scott Urman著
机械工业出版社
http://www.oradb.net 上有不少资料,可作参考!
kbkingbird 2002-05-30
  • 打赏
  • 举报
回复
不好意思~我是新手~你看看我这样写对吗?
CREATE OR REPLACE TRIGGER STUD_TRG_jk99327
BEFORE INSERT OR UPDATE OR DELETE ON STUD_jk99327
FOR EACH ROW
BEGIN
/* 修改 */
IF UPDATING THEN
IF NEW.XH!:=NEW_VALUE THEN /* 不等于是这样的吗? */
REISE_APPLICATION_ERROR(...); /* 这个地方填什么啊,我不懂 */
END IF;
END;
/
执行后是这样的~
警告: 创建的触发器带有编译错误。
有什么书可以看看吗?

谢谢~~
yfr 2002-05-30
  • 打赏
  • 举报
回复
可以在该触发器内判断并结合异常处理即可(伪码如下):
IF UPDATING THEN
IF <当前操作的纪录中的xh字段值与新值不同> THEN
RAISE_APPLICATION_ERROR(...);--触发异常,取消更新操作
END IF;
END IF;

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧