16

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

4

4 回答 4

17

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

转换regclass类型让您以简单的方式从限定表名转换为 OID(对象 ID)。

于 2015-04-14T08:37:58.080 回答
13

这是我使用 postresql 的第一天,但​​我认为您可以通过 pg_trigger 系统表检查触发器状态:http ://www.postgresql.org/docs/current/static/catalog-pg-trigger.html

您需要的列是tgrelidtgenabled

于 2009-04-01T07:32:13.007 回答
5
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)。

于 2016-01-20T12:19:51.717 回答
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;
于 2020-12-15T16:18:44.903 回答