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
。我发现还有几个其他有用的函数可供我使用:Nopg_get_typedef
或pg_get_castdef
,但那是另一天的事了。而且,是的,我将严格遵守|
而不是format()
。