如何 invoke/call 触发器内的序列
How to invoke/call a sequence inside a trigger
我想自动增加我创建的 table id。此 table 将保存有关从我的数据库中的某个 table 所做的更改的日志。下面是我的代码和我得到的错误。请帮助我,并提前谢谢你。
create or replace Trigger PVFC_audit
after insert or delete or update on customer
for each row
declare
v_user varchar2(20);
eventlog_id_go number;
v_date date;
v_time timestamp;
act_done varchar2(20) := case when updating then 'Update' when deleting then 'Delete' else 'Insert' end;
begin
IF eventlog_id IS NULL THEN <--- eventlog_id is the actual column in my eventlogs table
SELECT eventlog_id_seq.NEXTVAL , user, To_Char(sysdate,'DD/MON/YYY'), To_char(CURRENT_TIMESTAMP,'HH12:MI:SS')
INTO eventlog_id_go, v_user, v_date, v_time from dual;
END IF;
if inserting then
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_go, v_user, v_date, v_time, act_done , 'customer');
elsif deleting then
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_go, v_user, v_date, v_time, act_done,'customer');
elsif updating then
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_go, v_user, v_date, v_time, act_done ,'customer');
end if;
end;
-----下面是我创建的序列-----
CREATE SEQUENCE "SYSTEM"."EVENTLOG_ID_SEQ"
MINVALUE 1
MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 1
CACHE 20
NOORDER
NOCYCLE ;
错误 (13,4):PLS-00201:必须声明标识符 'EVENTLOG_ID'
你需要参考 pseudorecords old/new 值
IF :OLD.eventlog_id IS NULL THEN
或
IF :NEW.eventlog_id IS NULL THEN
eventlog_id is a column from another table named eventlogs
所以您不能在触发器中引用它:触发器只能看到拥有它的 table 的列。解决方案只是填充 INSERT 语句中的 eventlog_id
列。
顺便说一下,您的触发器有很多重复项。您可以极大地简化:
create or replace Trigger PVFC_audit
after insert or delete or update on customer
for each row
declare
act_done varchar2(20) := case when updating then 'Update' when deleting then 'Delete' else 'Insert' end;
begin
if inserting then
act_done := 'INSERT';
elsif deleting then
act_done := 'DELETE';
elsif updating then
act_done := 'UPDATE';
end if;
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_seq.NEXTVAL , user, To_Char(sysdate,'DD/MON/YYY'), To_char(CURRENT_TIMESTAMP,'HH12:MI:SS')
, act_done ,'customer');
end;
不确定为什么要将 date_done
和 time_done
填充为字符串。使用正确的数据类型会更有意义。
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_seq.NEXTVAL , user, trunc(sysdate), CURRENT_TIMESTAMP
, act_done ,'customer');
如果 EVENTLOGS 将这些列定义为 VARCHAR2,那么这几乎肯定是一个数据模型错误,在某些时候会让您感到痛苦。
我想自动增加我创建的 table id。此 table 将保存有关从我的数据库中的某个 table 所做的更改的日志。下面是我的代码和我得到的错误。请帮助我,并提前谢谢你。
create or replace Trigger PVFC_audit
after insert or delete or update on customer
for each row
declare
v_user varchar2(20);
eventlog_id_go number;
v_date date;
v_time timestamp;
act_done varchar2(20) := case when updating then 'Update' when deleting then 'Delete' else 'Insert' end;
begin
IF eventlog_id IS NULL THEN <--- eventlog_id is the actual column in my eventlogs table
SELECT eventlog_id_seq.NEXTVAL , user, To_Char(sysdate,'DD/MON/YYY'), To_char(CURRENT_TIMESTAMP,'HH12:MI:SS')
INTO eventlog_id_go, v_user, v_date, v_time from dual;
END IF;
if inserting then
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_go, v_user, v_date, v_time, act_done , 'customer');
elsif deleting then
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_go, v_user, v_date, v_time, act_done,'customer');
elsif updating then
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_go, v_user, v_date, v_time, act_done ,'customer');
end if;
end;
-----下面是我创建的序列-----
CREATE SEQUENCE "SYSTEM"."EVENTLOG_ID_SEQ"
MINVALUE 1
MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 1
CACHE 20
NOORDER
NOCYCLE ;
错误 (13,4):PLS-00201:必须声明标识符 'EVENTLOG_ID'
你需要参考 pseudorecords old/new 值
IF :OLD.eventlog_id IS NULL THEN
或
IF :NEW.eventlog_id IS NULL THEN
eventlog_id is a column from another table named eventlogs
所以您不能在触发器中引用它:触发器只能看到拥有它的 table 的列。解决方案只是填充 INSERT 语句中的 eventlog_id
列。
顺便说一下,您的触发器有很多重复项。您可以极大地简化:
create or replace Trigger PVFC_audit
after insert or delete or update on customer
for each row
declare
act_done varchar2(20) := case when updating then 'Update' when deleting then 'Delete' else 'Insert' end;
begin
if inserting then
act_done := 'INSERT';
elsif deleting then
act_done := 'DELETE';
elsif updating then
act_done := 'UPDATE';
end if;
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_seq.NEXTVAL , user, To_Char(sysdate,'DD/MON/YYY'), To_char(CURRENT_TIMESTAMP,'HH12:MI:SS')
, act_done ,'customer');
end;
不确定为什么要将 date_done
和 time_done
填充为字符串。使用正确的数据类型会更有意义。
insert into eventlogs(eventlog_id, user_name, date_done, time_done, action_done, object_name)
values (eventlog_id_seq.NEXTVAL , user, trunc(sysdate), CURRENT_TIMESTAMP
, act_done ,'customer');
如果 EVENTLOGS 将这些列定义为 VARCHAR2,那么这几乎肯定是一个数据模型错误,在某些时候会让您感到痛苦。