我们遇到了下面的触发器问题,我们必须禁用某些约束来添加表的主键:
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页面的示例中复制了语法。
实现我们想要的最简单方法是什么? 提前谢谢!
答案 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值的变化,随着应用程序的发展,您可能会一次又一次地面临这些问题。