我的谷歌搜索让我失望了。如何知道 PostgreSQL 触发器是否被禁用?
Hao
问问题
17529 次
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
您需要的列是tgrelid
和tgenabled
。
于 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 回答