如何判断 PostgreSQL 中是否启用了触发器?

问题描述 投票:0回答:5

我的谷歌搜索失败了。如何知道 PostgreSQL 触发器是否被禁用?

postgresql triggers status
5个回答
23
投票

下面的 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)。


17
投票
这是我使用 postresql 的第一天,但我认为你可以通过 pg_trigger 系统表检查触发器状态:

http://www.postgresql.org/docs/current/static/catalog-pg-trigger.html

您需要的列是

tgrelid

tgenabled


7
投票
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)。


0
投票
从@tolgayilmaz 回复开始,我创建了一个简单的函数来在我的项目中使用

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;
    

0
投票
参加聚会有点晚了,但我只想分享一个可能不错的答案:)

所以查询

-- 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;
那么有什么不同

    如果不是内部的,这意味着只有你的触发器
阅读该

系统表 column tgenabled

上的文档很重要。

    O => 这是 O(ooooh) 而不是 0(零)
  • D => 禁用
© www.soinside.com 2019 - 2024. All rights reserved.