数据库触发器代码报错!急!在线等!

数据库触发器代码报错!急!在线等!,第1张

没有看到报错原因,不知道哪里错了,但是感觉语法都有问题,我给你看一个例子吧,你直接copy到PL/SQL中,看以来方便点

create or replace trigger C_PRIVILEGE_SYN_TRIG

after insert or delete or update on mes_frame_role_user

for each row

declare

-- local variables here

newuser varchar2(20)

newrole varchar2(20)

olduser varchar2(20)

begin

newuser := :new.emp_no

newrole := :new.roleid

olduser := :old.emp_no

case

when inserting then

--insert the new authority to the old system

insert into c_privilege(

select distinct newuser, '', mf.function, 2, mf.module

from mes_frame_role_authority ra

inner join mes_frame_menu m on ra.menuid = m.id

inner join mes_frame_menu m2 on m.tonode = m2.id

inner join c_module_fun_t mf on m.caption = mf.function and m2.caption = mf.module

where ra.roleid = newrole)

when updating then

delete c_privilege where emp = newuser

insert into c_privilege(

select distinct newuser, '', mf.function, 2, mf.module

from mes_frame_role_authority ra

inner join mes_frame_menu m on ra.menuid = m.id

inner join mes_frame_menu m2 on m.tonode = m2.id

inner join c_module_fun_t mf on m.caption = mf.function and m2.caption = mf.module

where ra.roleid = newrole)

when deleting then

delete c_privilege where emp = olduser

end case

end C_PRIVILEGE_SYN_TRIG

因为LZ没有贴出的触发器代码,只好估测一下:

很可能是触发器中没有判断有效的修改数据记录数,比如使用一个变量从inserte或deleted中取出一个数据来判断是否符合要求。在update一条没有的数据时,由于inserted 或 deleted 中没有任何记录,从而变量的值为null,导致后面错误判断报错。

建议update触发器的一开始增加下面一行

if not exists(select * from inserted)

return

呵呵 楼主刚开始接触触发器吧

没有updated这个表 在sql中 更新的机制是先删除 再插入

帮你写个条件吧 其他的你应该能搞定

不明白可以随时问我 希望解决了楼主的问题

if exists(select 1 from inserted where weight >1000) and

exists(select 1 from deleted )


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6422002.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-21
下一篇2023-03-21

发表评论

登录后才能评论

评论列表(0条)

    保存