Oracle:修改TRIGGER中的primary / foreignkeys和约束

时间:2014-07-24 11:23:05

标签: sql oracle triggers constraints

我们遇到了下面的触发器问题,我们必须禁用某些约束来添加表的主键:

    create or replace trigger TRG_NAMENSAENDERUNG_MA
      after update of vname, nname on mitarbeiter
      referencing new as new old as old
      for each row
    declare
      initialien char(2);
      benutzernr int;
      benutzername_neu char(5);
      benutzername_alt char(5);
    begin

/*...
Code sets corect values to all variables.
...*/

/* the following is suposed to disable the two constraints*/
for i in (select fk_session_log_ben_name, SESSION_LOGGING FROM USER_CONSTRAINTS) loop
        execute immediate 'ALTER TABLE'||i.session_logging||' DISABLE CONSTRAINT '||i.fk_session_log_ben_name||'';
      end loop;

      for i in (select fk_geraetekto_ben_name, GERAETEKONTO FROM USER_CONSTRAINTS) loop
        execute immediate 'ALTER TABLE'||i.geraetekonto||' DISABLE CONSTRAINT '||i.fk_geraetekto_ben_name||'';
      end loop;

/*Update statements which can only work without the constraints!!: */

      UPDATE BENUTZERKONTO SET BENUTZERNAME = benutzername_neu WHERE BENUTZERNAME = benutzername_alt;
      UPDATE SESSION_LOGGING SET BENUTZERNAME = benutzername_neu WHERE BENUTZERNAME = benutzername_alt;
      UPDATE GERAETEKONTO SET BENUTZERNAME = benutzername_neu WHERE BENUTZERNAME = benutzername_alt;


/*Supposed to re-enable the constraints. */
      for i in (select fk_session_log_ben_name, SESSION_LOGGING FROM USER_CONSTRAINTS) loop
        execute immediate 'ALTER TABLE'||i.session_logging||' ENABLE CONSTRAINT '||i.fk_session_log_ben_name||'';
      end loop;

      for i in (select fk_geraetekto_ben_name, GERAETEKONTO FROM USER_CONSTRAINTS) loop
        execute immediate 'ALTER TABLE'||i.geraetekonto||' ENABLE CONSTRAINT '||i.fk_geraetekto_ben_name||'';
      end loop;
    end TRG_NAMENSAENDERUNG_MA;

它抛出了SESSION_LOGGING将成为“无效标识符”的错误。它虽然输入正确,但我们从Oracale页面的示例中复制了语法。

实现我们想要的最简单方法是什么? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

这是无效的标识符,USER_CONSTRAINTS中不存在这些列。完整的错误消息应该包含行号并给出含义的提示。

select fk_session_log_ben_name, SESSION_LOGGING FROM USER_CONSTRAINTS

代码应该是这样的:

select constraint_name fk_session_log_ben_name, table_name SESSION_LOGGING
FROM USER_CONSTRAINTS;

答案 1 :(得分:0)

我的第一个建议是重新设计架构,以便它不需要更改PK值(特别是用户)。 PK必须是代理人。像你这样的决定必须有充分的理由。希望你不需要这样的理由:)所提到的重新设计,可能比你遇到的问题更便宜。随着PK值的变化,随着应用程序的发展,您可能会一次又一次地面临这些问题。