是否可能在截断表B时或截断表B后捕获表B中的所有记录到表A中?



我试图写一个触发器与参考Postgres DOC。但是它甚至不允许创建一个基于truncate的触发器,尝试了不同的方法,但都不起作用。

CREATE TRIGGER delete_after_test
AFTER truncate
ON tableA
FOR EACH ROW
EXECUTE PROCEDURE delete_after_test3();

功能:

CREATE OR REPLACE FUNCTION econnect.delete_after_test3()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare 
query text;
begin
insert into econnect.delete_after_test_2 (
"name",
age1,
log_time 
)
values
(
old."name",
old.age1,
CURRENT_TIMESTAMP
)
;
return old;
END;
$function$
;

参考:https://www.postgresql.org/docs/current/sql-createtrigger.html

"TRUNCATE将不会触发任何可能存在于表上的ON DELETE触发器。但是它会触发TRUNCATE触发器。如果为任何表定义了ON TRUNCATE触发器,则在任何截断发生之前触发所有BEFORE TRUNCATE触发器,在执行最后一次截断并重置任何序列之后触发所有AFTER TRUNCATE触发器。触发器将按照处理表的顺序触发(首先是命令中列出的表,然后是由于级联而添加的表)">

使用ON DELETE:

create table delete_test(id integer, fld1 varchar, fld2 boolean);
create table delete_test_save(id integer, fld1 varchar, fld2 boolean);
insert into delete_test values (1, 'test', 't'), (2, 'dog', 'f'), (3, 'cat', 't')

CREATE OR REPLACE FUNCTION public.delete_save()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO delete_test_save SELECT * FROM del_recs;
RETURN OLD;
END;
$function$
CREATE TRIGGER trg_del_save
AFTER DELETE ON delete_test referencing OLD TABLE AS del_recs FOR EACH statement
EXECUTE FUNCTION delete_save ();
delete from delete_test;
DELETE 3
select * from delete_test;
id | fld1 | fld2 
----+------+------
(0 rows)
select * from delete_test_save;
id | fld1 | fld2 
----+------+------
1 | test | t
2 | dog  | f
3 | cat  | t

示例使用转换关系(referencing OLD TABLE AS del_recs)来收集所有已删除的记录,以便在函数中使用。然后可以执行INSERT INTO delete_test_save SELECT * FROM del_recs;将记录转移到另一个表。不,它们不能与TRUNCATE触发器一起工作.

这里解释了转换关系

reference选项启用转换关系集合,转换关系是行集,包括当前SQL语句插入、删除或修改的所有行。该特性允许触发器看到语句所做操作的全局视图,而不是一次只看到一行。此选项仅允许用于非约束触发器的AFTER触发器;此外,如果触发器是UPDATE触发器,则不能指定column_name列表。OLD TABLE只能指定一次,并且只能用于可以在UPDATE或DELETE时触发的触发器;它创建一个转换关系,其中包含由语句更新或删除的所有行的前图像。类似地,NEW TABLE只能被指定一次,并且只能在UPDATE或INSERT时触发一个触发器;它创建一个转换关系,其中包含由语句更新或插入的所有行的后像。

相关内容

  • 没有找到相关文章

最新更新