我不确定如何实现以下内容:
CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
DECLARE
shadowname varchar := TG_TABLE_NAME || 'shadow';
BEGIN
INSERT INTO shadowname VALUES(OLD.*);
RETURN OLD;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:
ERROR: relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)
它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.
我已经尝试过EXECUTE这样的事情:
EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)
但没有运气:
ERROR: syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)
该RECORD类型似乎失去了:OLD.*似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL值). …
我试图在PostgreSQL 8.2中编写一个触发器函数,它将动态使用TG_TABLE_NAME来生成和执行SQL语句.我可以为PostgreSQL的更高版本找到各种各样的例子,但由于一些要求,我被困在8.2上.这是我的功能,因为它有效,但几乎没有动态:
CREATE OR REPLACE FUNCTION cdc_TABLENAME_function() RETURNS trigger AS $cdc_function$
DECLARE
op cdc_operation_enum;
BEGIN
op = TG_OP;
IF (TG_WHEN = 'BEFORE') THEN
IF (TG_OP = 'UPDATE') THEN
op = 'UPDATE_BEFORE';
END IF;
INSERT INTO cdc_test VALUES (DEFAULT,DEFAULT,op,DEFAULT,DEFAULT,OLD.*);
ELSE
IF (TG_OP = 'UPDATE') THEN
op = 'UPDATE_AFTER';
END IF;
INSERT INTO cdc_test VALUES (DEFAULT,DEFAULT,op,DEFAULT,DEFAULT,NEW.*);
END IF;
IF (TG_OP = 'DELETE') THEN
RETURN OLD;
ELSE
RETURN NEW;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
这是当前编写的方式,我将不得不为每个表编写一个单独的触发器函数.我想使用TG_TABLE_NAME来动态构建我的INSERT语句,并在其前面加上'cdc_',因为所有表都遵循相同的命名约定.然后我可以让每个表调用的每个触发器只有一个函数.
我正在开始尝试新数据库中的一些东西,并遇到了问题.我是PostgreSQL的新手.
我正在尝试在users表的列中创建值的更改历史记录.这个想法很简单.每当有更新时,都会在另一个表(代表历史记录)中插入新记录.
DROP FUNCTION IF EXISTS LOCA_APP.FUNC_HISTORICO_MOD_USUARIOS() CASCADE;
CREATE OR REPLACE FUNCTION LOCA_APP.FUNC_HISTORICO_MOD_USUARIOS() RETURNS TRIGGER
AS $$
BEGIN
EXECUTE 'INSERT INTO LOCA_APP.TB_MODIFICACOES (
MOD_MOMENTO , -- Translated to: Moment
MOD_VALOR_ANTERIOR , -- Translated to: Old value
MOD_VALOR_ATUAL , -- Translated to: New value
MOD_USUARIO , -- Translated to: User (ID)
MOD_DADO) -- Translated to: Data (Column Name - ID)
VALUES(
now() ,
OLD.' || TG_ARGV[0] || ' ,
NEW.' || TG_ARGV[0] || ' ,
'|| TG_RELID || ' ,
(SELECT …Run Code Online (Sandbox Code Playgroud)