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

时间:2009-04-01 06:15:12

标签: postgresql triggers status

我的googling-fu让我失望了。如何知道PostgreSQL触发器是否被禁用?

4 个答案:

答案 0 :(得分:8)

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

您需要的列是tgrelidtgenabled

答案 1 :(得分:6)

下面的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”,则触发器被禁用。所有其他值(记录为here)表示它以某种方式启用。

顺便说一句。如果要检查特定表的触发器,则查询会更短:

SELECT * FROM pg_trigger
WHERE tgrelid = 'your_schema.your_table'::regclass

强制转换regclass类型可以轻松地将您从限定表名转移到OID(对象ID)。

答案 2 :(得分:4)

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

答案 3 :(得分: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;