我的googling-fu让我失望了。如何知道PostgreSQL触发器是否被禁用?
答案 0 :(得分:8)
这是我使用postgresql的第一天,但我认为您可以通过pg_trigger系统表检查触发状态:http://www.postgresql.org/docs/current/static/catalog-pg-trigger.html
您需要的列是tgrelid
和tgenabled
。
答案 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;