【问题标题】:Updating trigger (how)更新触发器(如何)
【发布时间】:2017-12-04 18:52:20
【问题描述】:

有人可以帮忙更新触发器吗?我知道我应该使用 alter 子句,但在那之后我被卡住了。我想更改此触发器:

CREATE OR REPLACE TRIGGER  "CR_SURGERY_AUDIT"  
before insert or delete or update on CR_SURGERY
for each row
declare 
V_user varchar2 (30);
V_date varchar2 (30); 
begin 
select user, to_char(sysdate, 'dd/mon/yyyy hh24:mi:SS') INTO v_user, v_date
from dual;
IF inserting THEN
insert into CR_SURGERY_AUDIT (new_name, old_name, user_name, entry_date, operation)
VALUES (:NEW.CR_SURGERY, NULL, v_user, v_date, 'insert');
ELSIF DELETING THEN
insert into CR_SURGERY_AUDIT (new_name, old_name, user_name, entry_date, operation)
VALUES (null, :OLD.CR_SURGERY, v_user, v_date, 'delete');
ELSIF UPDATING THEN
insert into CR_SURGERY_AUDIT (new_name, old_name, user_name, entry_date, operation)
VALUES (:NEW.CR_SURGERY, :OLD.CR_SURGERY, v_user, v_date, 'Update');
END IF;
END;

我知道这很简单,但我找不到编写它的方法。我想添加 FK_SOCRD_ID 使其更新为:

select user, to_char(sysdate, 'dd/mon/yyyy') INTO v_user, v_date from dual;
IF inserting THEN
insert into CR_SURGERY_AUDIT (new_name, old_name, user_name, entry_date,
operation, FK_SOCRD_ID)  
VALUES (:NEW.CR_SURGERY, NULL, v_user, v_date, 'insert');

【问题讨论】:

  • create or replace trigger 已经用您的新代码替换了现有触发器。或者您可以直接删除并重新创建它。
  • 天啊。好的。我确实读到很可能我必须删除并重新创建它,但希望有另一种解决方法来更新它。
  • 顺便说一下,您不需要 select ... into ... from dual,因为 PL/SQL 有一个方便的 := 赋值运算符 :) 此外,user 将始终是触发器所有者的名称。也许sys_context(‘userenv’,’os_user’) 对审计更有用。
  • 嗨威廉,我该怎么写?对不起,我是新手。如果你不介意:)

标签: plsql sql-update alter eventtrigger


【解决方案1】:

没有修改触发器的语法,您只需修改您的create or replace trigger 代码并重新运行即可。

根据您提出的更改,我将其改成如下:

create or replace trigger cr_surgery_audit
before insert or delete or update on cr_surgery
for each row
declare
    k_user constant cr_surgery_audit.user_name%type := sys_context('userenv','os_user');
    k_date constant cr_surgery_audit.entry_date%type := sysdate;
begin
    if inserting then
        insert into cr_surgery_audit (new_name, old_name, user_name, entry_date, operation, fk_socrd_id)  
        values (:new.cr_surgery, null, k_user, k_date, 'insert', 12345);
    elsif deleting then
        insert into cr_surgery_audit (new_name, old_name, user_name, entry_date, operation)
        values (null, :old.cr_surgery, k_user, k_date, 'delete');
    elsif updating then
        insert into cr_surgery_audit (new_name, old_name, user_name, entry_date, operation)
        values (:new.cr_surgery, :old.cr_surgery, k_user, k_date, 'update');
    end if;
end;

我假设 cr_surgery_audit.entry_date 实际上是 date 而不是 varchar2

您需要一个值来填充 fk_socrd_id,因此我将 123456 作为虚拟值输入。

【讨论】:

  • 太棒了。谢谢楼主!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多