启用触发器时无法删除行

时间:2018-04-04 13:47:13

标签: postgresql triggers

需要帮助。我有一个表和emp模式中的相应审计表。启用触发器时,我无法从源表中删除该条目。 该表映射到触发器,如下所述。

下面是通用函数,我用它来审计所有表。

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

两者之间的区别是modified_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)上执行delete时,查询执行正常,但它显示0行受影响。 当我在表中查询select * from test_empname,其中id = 3时,它仍然存在。但是你可以在审计中看到删除的条目。

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

1 个答案:

答案 0 :(得分:1)

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$