我希望我的触发器确定ApprUserNo = SubmitUserNo或OrgParentNo。到目前为止,我的扳机是:
CREATE OR REPLACE TRIGGER cteam_Trigger1
BEFORE INSERT OR UPDATE OF ApprUserNo
ON cteam_ExpenseReport
FOR EACH ROW
DECLARE
ApprOrgNo cteam_Users.UserOrgNo%TYPE;
SubUserOrgNo cteam_Users.UserOrgNo%TYPE;
UserOrgParentOrg cteam_OrgUnit.OrgParentNo%TYPE;
Unauthorized EXCEPTION;
ErrorMessage VARCHAR2(200);
BEGIN
SELECT UserOrgNo
INTO ApprOrgNo
FROM cteam_Users
WHERE UserOrgNo = :NEW.ApprUserNo;
SELECT UserOrgNo
INTO SubUserOrgNo
FROM cteam_Users
WHERE UserOrgNo = :NEW.SubmitUserNo;
SELECT DECODE OrgParentNo (UserOrgParentNo,'Null',Raise Unauthorized )
INTO UserOrgParentNo
FROM cteam_OrgUnit;
WHERE UserOrgParentNo = :NEW.OrgParentNo;
EXCEPTION
WHEN Unauthorized THEN
ErrorMessage := 'Unauthorised to update ' ;
END;触发器可以正常运行,直到选择解码部分。
发布于 2019-12-04 12:42:11
FROM cteam_OrgUnit; -分号不应该在那里。解码(OrgParentNo UserOrgParentNo,'Null',引发未经授权)
但是,在解码器中不能有可执行语句(如RAISE UNAUTHORIZED ),它只处理值。我建议您将代码重写为
为每一行创建或替换触发器cteam_Trigger1 (在cteam_ExpenseReport上插入或更新ApprUserNo ),声明vUserOrgParentNo cteam_OrgUnit.OrgParentNo%TYPE;开始从cteam_OrgUnit ou选择ou.OrgParentNo to vUserOrgParentNo,其中ou.OrgParentNo = :NEW.OrgParentNo;如果vUserOrgParentNo <> :NEW.ApprUserNo,RAISE_APPLICATION_ERROR(-20000,“未经授权更新”);结束IF;END;
我删除了获取数据且从未使用的SELECT语句;同样,我删除了与这些选择相关的变量。我用一个案例表达式替换了解码,因为我发现一个案例表达式更容易阅读。我建议您在变量前加上一个额外的字符,例如我添加到vUserOrgParent中的vUserOrgParent,以防止变量名与表中的列名发生冲突。这是问题的潜在来源,比其他任何问题都更容易解决。对于表中正确的列名,我也作了一些猜测--如果它们是错误的,请随意修改它们。
触发器也不能返回错误消息。他们与其他代码“沟通”的唯一方法是引发异常。我向RAISE_APPLICATION_ERROR添加了一个调用,这样触发器就可以引发一个已知的异常号。
https://stackoverflow.com/questions/59175613
复制相似问题