Postgresql 在Postgres中生成创建触发器代码的例程

Postgresql 在Postgres中生成创建触发器代码的例程,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我还没有找到检索触发器定义代码的简单方法。我指的是触发器/绑定声明,而不是触发器函数。我想我应该使用一些系统目录来构建一个脚本。以下不完整的版本生成合理的输出: CREATE OR REPLACE FUNCTION dba.ddl_get_build_trigger_code(trigger_id oid) -- I starting from having the OID. RETURNS text AS $BODY$ DECLARE trigger_name_in text;

我还没有找到检索触发器定义代码的简单方法。我指的是触发器/绑定声明,而不是触发器函数。我想我应该使用一些系统目录来构建一个脚本。以下不完整的版本生成合理的输出:

CREATE OR REPLACE FUNCTION dba.ddl_get_build_trigger_code(trigger_id oid) -- I starting from having the OID.
    RETURNS text

AS $BODY$

DECLARE

trigger_name_in text;
code text;

BEGIN
/*
What the original declaration looks like:

CREATE TRIGGER trigger_hsys_after_delete
    AFTER DELETE
    ON data.hsys
    REFERENCING OLD TABLE AS deleted_rows
    FOR EACH STATEMENT
    EXECUTE PROCEDURE data.trigger_function_log_deletion_count();
*/

SELECT tgname FROM pg_trigger WHERE oid = trigger_id INTO trigger_name_in; -- information_schema tables don't use PG OIDs.

RETURN 
'CREATE TRIGGER ' || trigger_name || chr(10) ||
 chr(9) || action_timing || ' ' || event_manipulation || chr(10) ||
 chr(9) || 'ON ' || event_object_schema || '.' || event_object_table ||

 CASE WHEN action_reference_old_table IS NOT NULL THEN
 chr(10) || chr(9) || 'REFERENCING OLD TABLE AS ' || action_reference_old_table || chr(10) END ||

--  CASE WHEN action_reference_new_table IS NOT NULL THEN
--  chr(10) || chr(9) || 'REFERENCING NEW TABLE AS ' || action_reference_new_table || chr(10) END ||

 chr(9) || 'FOR EACH ' || action_orientation || chr(10) ||
 chr(9) || action_statement || ';' as create_trigger_code

  FROM information_schema.triggers 
 WHERE trigger_name = trigger_name_in;

END;
 $BODY$
LANGUAGE plpgsql;
这是一个样本,与我的实际案例相符:

CREATE TRIGGER trigger_hsys_after_delete
    AFTER DELETE
    ON data.hsys
    REFERENCING OLD TABLE AS deleted_rows
    FOR EACH STATEMENT
    EXECUTE PROCEDURE trigger_function_log_deletion_count();
information\u schema.triggers
中还有几个属性可能有值,例如action\u reference\u new\u table。当我启用下面的行并且
action\u reference\u new\u table
NULL
时,脚本返回
NULL

CASE WHEN action_reference_new_table IS NOT NULL THEN
chr(10) || chr(9) || 'REFERENCING NEW TABLE AS ' || action_reference_new_table || chr(10) END ||
我不明白为什么
action\u reference\u new\u表的
NULL
值会破坏我的连接代码并使整个结果
NULL

除了在这个特定问题上提供帮助外,请随意指出我应该做些什么来编写更合理的PL/PgSQL代码。事实证明,对我来说,掌握它比我想象的要难。

简单地使用

SELECT pg_get_triggerdef(oid)
FROM pg_trigger
WHERE tgname = trigger_name_in;

此外,在编写SQL代码时不要使用字符串连接。SQL注入的危险太大了。将
format()
函数与
%I
占位符一起使用。

漂亮!我知道的是
pg_get_viewdef
,而不是
pg_get_triggerdef
。我发现还有几个其他有用的函数可供我使用:No
pg_get_typedef
pg_get_castdef
,但那是另一天的事了。而且,是的,我将严格遵守
|
而不是
format()