Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
触发器SQL中的更新名称(与以前不同)_Sql_Plsql_Oracle11g - Fatal编程技术网

触发器SQL中的更新名称(与以前不同)

触发器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

我正在为一个公司数据库编写一个触发器,这个触发器用于更新一个员工的姓名(例如在罕见的更改姓名的情况下),该姓名应该与以前的姓名不同,或者不为NULL

这是我写的代码。它进行编译,但在更新时出错(ORA-04091:table COMPANY.EMPLOYEE正在变异,触发器/函数可能看不到 它)。我注意到这是由每行的
引起的,但我无法删除它,因为否则
: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块是个好主意。这样就不会将无效名称分配给员工。而不是“无法更新名称”。异常可能引发“无效名称”。未更新员工的。