我的谷歌搜索失败了。如何知道 PostgreSQL 触发器是否被禁用?
下面的 SQL 将完成这项工作。它显示当前数据库中的所有触发器。
SELECT pg_namespace.nspname, pg_class.relname, pg_trigger.*
FROM pg_trigger
JOIN pg_class ON pg_trigger.tgrelid = pg_class.oid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
如果 tgenabled 为“D”,则触发器被禁用。所有其他值(记录在此处)表明它以某种方式启用。
顺便说一句。如果你想检查特定表的触发器,查询会短一点:
SELECT * FROM pg_trigger
WHERE tgrelid = 'your_schema.your_table'::regclass
将
cast 转换为 regclass 类型可以让您以简单的方式从 限定表名 转换为 OID(对象 ID)。
SELECT EXISTS (
SELECT tgenabled
FROM pg_trigger
WHERE tgname='your_unique_trigger_name' AND
tgenabled != 'D'
);
如果您知道触发器名称是唯一的,如果启用了
your_unique_trigger_name 触发器,则上述内容将返回 true (t):
exists
--------
t
(1 row)
如果禁用,它将返回 false (f)。
CREATE OR REPLACE FUNCTION trigger_exists_on_table(schema_name text, table_name text, trigger_name text)
RETURNS boolean AS
$body$
declare
_sql text;
_boolean_exists boolean;
begin
_sql := format('
SELECT EXISTS (
SELECT 1
FROM pg_trigger
WHERE tgrelid = ''%s.%s''::regclass AND tgname = ''%s'' AND tgenabled != ''D''
)
', schema_name, table_name, trigger_name);
execute _sql into _boolean_exists;
return _boolean_exists;
end
$body$
LANGUAGE plpgsql;
所以查询
-- for a specific table_name
select tgname, tgenabled from pg_trigger where tgrelid = '[table_name]'::regclass and tgisinternal = false;
-- for all your triggers
select tgname, tgenabled from pg_trigger where tgisinternal = false;
那么有什么不同
上的文档很重要。