启用触发器时无法删除行



需要帮助。我有一个表和EMP Schema中的相应审核表。当启用触发器时,我无法从源表删除条目。该表被映射到下面所述的扳机。

以下是通用函数,我用它在所有表中进行审核。

Function:
============
CREATE OR REPLACE FUNCTION emp.fn_entry_audit()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
declare
col_name  text:='';
audit_table_name text := TG_TABLE_NAME || '_audit';
begin
 if TG_OP = 'UPDATE' or TG_OP = 'INSERT' THEN 
EXECUTE format('INSERT INTO emp.%1$I  SELECT ($1).*,'''||TG_OP||'''',audit_table_name) using NEW;
else 
EXECUTE format('INSERT INTO emp.%1$I  SELECT ($1).*,'''||TG_OP||'''',audit_table_name) using old;
 end if;
return new;
END $function$
Trigger creation
=================
create trigger trig_anish before insert or delete or update on emp.test_empname for each row execute procedure acaas.fn_entry_audit()
Table
======
create table emp.test_empname(id int4,fname varchar(300) not null,lname varchar(400),salary int4,last_modified_dt timestamp);
create table emp.test_empname_audit(id int4,fname varchar(300) not null,lname varchar(400),salary int4,last_modified_dt timestamp,modified_type varchar(10));

两者之间的差异是MIDIFIED_TYPE列,它将提及数据是插入,更新还是删除的数据(TG_OP来自以上函数(。

现在,当我在emp.test_empname中插入值时,它在emp.test_empname_audit中正确插入。

select * from emp.test_empname;
emp.test_empname:
==================
id  fname       lname       salary      last_modified_dt
===============================================================
1   stacker     pentacost   1000            04-04-18
2   lyri        pav         2000            04-04-18
3   TEST        TEST1       1000            04-04-18      
   select * from emp.test_empname_audit;
    id  fname       lname       salary      last_modified_dt  modified_type
    ===============================================================
    1   stacker     pentacost   1000            04-04-18      INSERT
    2   lyri        pav         1000            04-04-18      INSERT    
    2   lyri        pav         2000            04-04-18      UPDATE
    3   TEST        TEST1       1000            04-04-18      Delete

现在,问题是每当我在源表上执行删除(test_empname(时,查询就可以执行正常,但是它显示了0行影响。当我在表中查询从test_empname中选择 * id = 3的选择 *时,它仍然存在。但是您可以将审核中的条目视为删除。

我禁用了触发器并执行删除函数,执行正常,并且行受到影响。如何影响我的删除功能。请帮助!

CREATE OR REPLACE FUNCTION acaas.fn_entry_audit1()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
declare
col_name  text:='';
audit_table_name text := TG_TABLE_NAME || '_audit';
begin
 if TG_OP = 'UPDATE' or TG_OP = 'INSERT' THEN 
EXECUTE format('INSERT INTO acaas.%1$I  SELECT ($1).*,'''||TG_OP||'''',audit_table_name) using NEW;
return new;
else 
EXECUTE format('INSERT INTO acaas.%1$I  SELECT ($1).*,'''||TG_OP||'''',audit_table_name) using old;
return old;
 end if;
END $function$

最新更新