rli*_*lib 7 postgresql triggers
我在哪里可以找到有关POSTGRES tgtype的文档,例如:
SELECT * FROM pg_trigger;
===>
tgtype = 23;
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
Erw*_*ter 15
tgtype
是(每个文件):
位掩码识别触发器触发条件
但那里没有识别出个别位.
该源代码说:
Run Code Online (Sandbox Code Playgroud)41 int16 tgtype; /* BEFORE/AFTER/INSTEAD, UPDATE/DELETE/INSERT, 42 * ROW/STATEMENT; see below */ ... 93 /* Bits within tgtype */ 94 #define TRIGGER_TYPE_ROW (1 << 0) 95 #define TRIGGER_TYPE_BEFORE (1 << 1) 96 #define TRIGGER_TYPE_INSERT (1 << 2) 97 #define TRIGGER_TYPE_DELETE (1 << 3) 98 #define TRIGGER_TYPE_UPDATE (1 << 4) 99 #define TRIGGER_TYPE_TRUNCATE (1 << 5) 100 #define TRIGGER_TYPE_INSTEAD (1 << 6) 101 102 #define TRIGGER_TYPE_LEVEL_MASK (TRIGGER_TYPE_ROW) 103 #define TRIGGER_TYPE_STATEMENT 0
23
转换为00010111
最低有效8位,应该代表:
CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE ON table_name
FOR EACH ROW
EXECUTE PROCEDURE func_name();
Run Code Online (Sandbox Code Playgroud)
我现有数据库中的几个快速测试似乎证实了这一点.
谢谢 rlib 和欧文。这正是我想要的。
我为此整理了一个查询。如果其他人需要的话我会把它留在这里。
SELECT
n.nspname as schema_name,
c.relname as table_name,
t.tgname as trigger_name,
proname as function_name,
tgtype::int::bit(7) as condition_bits,
CASE WHEN (tgtype::int::bit(7) & b'0000001')::int = 0 THEN 'STATEMENT' ELSE 'EACH ROW' END as cond_row,
COALESCE(
CASE WHEN (tgtype::int::bit(7) & b'0000010')::int = 0 THEN NULL ELSE 'BEFORE' END,
CASE WHEN (tgtype::int::bit(7) & b'0000010')::int = 0 THEN 'AFTER' ELSE NULL END,
CASE WHEN (tgtype::int::bit(7) & b'1000000')::int = 0 THEN NULL ELSE 'INSTEAD' END,
''
)::text as cond_timing,
(CASE WHEN (tgtype::int::bit(7) & b'0000100')::int = 0 THEN '' ELSE ' INSERT' END) ||
(CASE WHEN (tgtype::int::bit(7) & b'0001000')::int = 0 THEN '' ELSE ' DELETE' END) ||
(CASE WHEN (tgtype::int::bit(7) & b'0010000')::int = 0 THEN '' ELSE ' UPDATE' END) ||
(CASE WHEN (tgtype::int::bit(7) & b'0100000')::int = 0 THEN '' ELSE ' TRUNCATE' END)
as cond_event
FROM pg_trigger t
JOIN pg_proc p ON t.tgfoid = p.oid
JOIN pg_class c ON c.oid = t.tgrelid
JOIN pg_namespace n ON n.oid = c.relnamespace;
Run Code Online (Sandbox Code Playgroud)
编辑:
嗯,那就太过分了。事实证明,上述位工作已经在架构triggers
的视图中完成information_schema
。
更轻松:SELECT * FROM information_schema.triggers
归档时间: |
|
查看次数: |
1139 次 |
最近记录: |