我试图阻止任何人删除特定模式“公共”上的表,除非用户是一个rds_superuser
但我编写的函数正在保护所有模式。
CREATE OR REPLACE FUNCTION guard_tables()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF TG_TABLE_SCHEMA = 'public' AND (SELECT COUNT(*) FROM pg_roles WHERE pg_has_role(CURRENT_USER, oid, 'member') AND rolname = 'rds_superuser') = 0 THEN
RAISE EXCEPTION 'command % is disabled for this table', tg_tag;
END IF;
END;
$$;
我怎样才能让它工作?
TG_TABLE_SCHEMA
未在事件触发器中设置。您必须调用
pg_event_trigger_dropped_objects()
以获取有关丢弃对象的信息。结果列中有schema_name
,其中包含受影响对象的模式名称。