'CREATE TRIGGER' 在 PostgreSQL 9.4.2 中使用什么锁(如果有)

What lock, if any, does 'CREATE TRIGGER' use in PostgreSQL 9.4.2

根据 postgres-xl, CREATE TRIGGER uses the SHARE ROW EXCLUSIVE lock, but according to the official Postgres docs 对于 SHARE ROW EXCLUSIVE

This lock mode is not automatically acquired by any PostgreSQL command.

您正在将 Postgres-XL 与主要的 PostgreSQL 文档进行比较。两种不同的产品,尽管有着共同的历史。 Postgres-XL 对普通 PostgreSQL 进行了 很多 的更改。

CREATE TRIGGER 应该列在 Pg 文档中,但实际上并没有,这是一种疏忽。

快速查看源代码显示 CREATE TRIGGER 采用 ShareRowExclusiveLock,因此在这种情况下 XL 的文档与 PostgreSQL 的行为相匹配。

您可以通过以下方式自行检查,而无需查看来源:

CREATE TABLE test();

CREATE OR REPLACE FUNCTION dummy_tg() RETURNS TRIGGER
LANGUAGE plpgsql AS $$ BEGIN END; $$;

BEGIN;

CREATE TRIGGER blah BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE dummy_tg();

\x

SELECT * FROM pg_locks 
WHERE pid = pg_backend_pid() 
AND relation = 'test'::regclass;

ROLLBACK;

...这表明我对来源的阅读是错误的,因为:

locktype | relation
mode     | AccessExclusiveLock

它需要一个 AccessExclusiveLock。