触发器SQL中的更新名称(与以前不同)
我正在为一个公司数据库编写一个触发器,这个触发器用于更新一个员工的姓名(例如在罕见的更改姓名的情况下),该姓名应该与以前的姓名不同,或者不为NULL 这是我写的代码。它进行编译,但在更新时出错(ORA-04091:table COMPANY.EMPLOYEE正在变异,触发器/函数可能看不到 它)。我注意到这是由每行的触发器SQL中的更新名称(与以前不同),sql,plsql,oracle11g,Sql,Plsql,Oracle11g,我正在为一个公司数据库编写一个触发器,这个触发器用于更新一个员工的姓名(例如在罕见的更改姓名的情况下),该姓名应该与以前的姓名不同,或者不为NULL 这是我写的代码。它进行编译,但在更新时出错(ORA-04091:table COMPANY.EMPLOYEE正在变异,触发器/函数可能看不到 它)。我注意到这是由每行的引起的,但我无法删除它,因为否则:new和:old引用将无法工作 CREATE OR REPLACE TRIGGER NO_INVALID_NAME AFTER UPDATE OF
引起的,但我无法删除它,因为否则:new
和:old
引用将无法工作
CREATE OR REPLACE TRIGGER NO_INVALID_NAME
AFTER UPDATE OF EMPLOYEE_NAME ON EMPLYEE
FOR EACH ROW
DECLARE
INVALID_NAME EXCEPTION;
CORRECT_NAME EXCEPTION;
BEGIN
UPDATE EMPLOYEE
SET EMPLOYEE_NAME =:NEW.EMPLOYEE_NAME
WHERE EMPLOYEE_NAME =:OLD.EMPLOYEE_NAME;
IF :NEW.EMPLOYEE_NAME <> :OLD.EMPLOYEE_NAME AND IS NOT NULL THEN
RAISE INVALID_NAME;
ELSE
RAISE CORRECT_NAME;
END IF;
EXCEPTION
WHEN NOME_NON_CORRETTO
THEN RAISE_APPLICATION_ERROR(-20009,'Name cannot be updated.');
WHEN CORRECT_NAME
THEN DBMS_OUTPUT.PUT_LINE('Updated.');
END;
创建或替换触发器否\u无效\u名称
更新员工姓名后
每行
声明
无效的_名称异常;
正确的名称异常;
开始
更新员工
设置员工名称=:NEW.EMPLOYEE\u NAME
其中EMPLOYEE\u NAME=:OLD.EMPLOYEE\u NAME;
如果:NEW.EMPLOYEE\u NAME:OLD.EMPLOYEE\u NAME且不为空,则
提出无效的_名称;
其他的
提出正确的名称;
如果结束;
例外情况
当NOME_NON_CORRETTO
然后引发应用程序错误(-20009,“名称无法更新”);
你的名字什么时候正确
然后DBMS_OUTPUT.PUT_LINE('Updated');
结束;
我想我把:NEW和:OLD语句搞乱了,但我看不出在哪里。第2行的表名有一个拼写错误,所以我们把它改为EMPLOYEE
更新员工姓名后
我会尝试添加:NEW.EMPLOYEE_NAME before IS NOT NULL子句,但我确信它是否解决了所有问题
IF(:NEW.EMPLOYEE_NAME <> :OLD.EMPLOYEE_NAME AND :NEW.EMPLOYEE_NAME IS NOT NULL)
如果(:NEW.EMPLOYEE\u NAME:OLD.EMPLOYEE\u NAME和:NEW.EMPLOYEE\u NAME不为空)
第2行中的表名有一个输入错误,所以我们将其改为EMPLOYEE
更新员工姓名后
我会尝试添加:NEW.EMPLOYEE_NAME before IS NOT NULL子句,但我确信它是否解决了所有问题
IF(:NEW.EMPLOYEE_NAME <> :OLD.EMPLOYEE_NAME AND :NEW.EMPLOYEE_NAME IS NOT NULL)
如果(:NEW.EMPLOYEE\u NAME:OLD.EMPLOYEE\u NAME和:NEW.EMPLOYEE\u NAME不为空)
在触发器中执行与更新中相同的操作。
因此,“应用程序”进行更新(不提交),然后触发器进行相同的更新,然后验证:new.name
和old.name
试试这个:
CREATE OR REPLACE TRIGGER NO_INVALID_NAME
BEFORE UPDATE ON EMPLOYEE
FOR EACH ROW
DECLARE
INVALID_NAME EXCEPTION;
CORRECT_NAME EXCEPTION;
BEGIN
IF :NEW.EMPLOYEE_NAME <> :OLD.EMPLOYEE_NAME AND :NEW.EMPLOYEE_NAME IS NOT NULL THEN
RAISE INVALID_NAME;
ELSE
RAISE CORRECT_NAME;
END IF;
EXCEPTION
WHEN NOME_NON_CORRETTO
THEN RAISE_APPLICATION_ERROR(-20009,'Name cannot be updated.');
WHEN CORRECT_NAME
THEN DBMS_OUTPUT.PUT_LINE('Updated.');
END;
创建或替换触发器否\u无效\u名称
在更新员工信息之前
每行
声明
无效的_名称异常;
正确的名称异常;
开始
如果:NEW.EMPLOYEE\u NAME:OLD.EMPLOYEE\u NAME和:NEW.EMPLOYEE\u NAME不为空,则
提出无效的_名称;
其他的
提出正确的名称;
如果结束;
例外情况
当NOME_NON_CORRETTO
然后引发应用程序错误(-20009,“名称无法更新”);
你的名字什么时候正确
然后DBMS_OUTPUT.PUT_LINE('Updated');
结束;
在触发器中执行与更新中相同的操作。
因此,“应用程序”进行更新(不提交),然后触发器进行相同的更新,然后验证:new.name
和old.name
试试这个:
CREATE OR REPLACE TRIGGER NO_INVALID_NAME
BEFORE UPDATE ON EMPLOYEE
FOR EACH ROW
DECLARE
INVALID_NAME EXCEPTION;
CORRECT_NAME EXCEPTION;
BEGIN
IF :NEW.EMPLOYEE_NAME <> :OLD.EMPLOYEE_NAME AND :NEW.EMPLOYEE_NAME IS NOT NULL THEN
RAISE INVALID_NAME;
ELSE
RAISE CORRECT_NAME;
END IF;
EXCEPTION
WHEN NOME_NON_CORRETTO
THEN RAISE_APPLICATION_ERROR(-20009,'Name cannot be updated.');
WHEN CORRECT_NAME
THEN DBMS_OUTPUT.PUT_LINE('Updated.');
END;
创建或替换触发器否\u无效\u名称
在更新员工信息之前
每行
声明
无效的_名称异常;
正确的名称异常;
开始
如果:NEW.EMPLOYEE\u NAME:OLD.EMPLOYEE\u NAME和:NEW.EMPLOYEE\u NAME不为空,则
提出无效的_名称;
其他的
提出正确的名称;
如果结束;
例外情况
当NOME_NON_CORRETTO
然后引发应用程序错误(-20009,“名称无法更新”);
你的名字什么时候正确
然后DBMS_OUTPUT.PUT_LINE('Updated');
结束;
您检查过这个吗?我已经查阅了很多文档,但是也许你可以给我推荐一些页面,可以让我的代码发挥作用?我不理解这里的业务规则。为什么更新触发器尝试更新自己的表?为什么employee\u name
允许为空?如果要防止更改名称,只需在以下情况下引发异常:If:new.employee\u name:old.employee\u name
。如果允许更改名称,那么触发器是什么?您检查过这个吗?我已经查阅了很多文档,但是也许你可以给我推荐一些页面,可以让我的代码发挥作用?我不理解这里的业务规则。为什么更新触发器尝试更新自己的表?为什么employee\u name
允许为空?如果要防止更改名称,只需在以下情况下引发异常:If:new.employee\u name:old.employee\u name
。如果允许更改姓名,那么触发的原因是什么?是的,很抱歉,EMPLYEE是个错误。另外:NEW.EMPLOYEE_NAME NOT NULL不起作用tho,仍然给了我(ORA-04091:table COMPANY.EMPLOYEE正在变异,触发器/函数可能看不到)错误。可能只是操作顺序不起作用?在更新之前放置IF块是个好主意。这样就不会将无效名称分配给员工。而不是“无法更新名称”。异常可能引发“无效名称”。没有更新员工。是的,很抱歉,员工出错了。另外:NEW.EMPLOYEE_NAME NOT NULL不起作用tho,仍然给了我(ORA-04091:table COMPANY.EMPLOYEE正在变异,触发器/函数可能看不到)错误。可能只是操作顺序不起作用?在更新之前放置IF块是个好主意。这样就不会将无效名称分配给员工。而不是“无法更新名称”。异常可能引发“无效名称”。未更新员工的。