Search code examples
plsqlsql-updatealtereventtrigger

Updating trigger (how)


can someone help with updating a trigger? I know I am supposed to use the alter clause but after that I am stuck. I would like to alter this trigger:

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;

I know it's simple but I cannot find a way to compose it. I want to add FK_SOCRD_ID so it updates to:

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');

Solution

  • There is no syntax to modify triggers, you just modify your create or replace trigger code and rerun it.

    With your proposed change, I make it something like this:

    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;
    

    I've assumed cr_surgery_audit.entry_date is actually a date and not a varchar2.

    You need a value to populate fk_socrd_id with, so I put in 123456 as a dummy value.