在postgres中,我想在插入時為我的所有表的每一行動態地添加一個觸發器。 我希望能夠為所有未來添加的表添加觸發器,而不需要資料庫用戶做其他事情來創建一個表(比如呼叫一個函式來創建一個表,而不是使用CREATE TABLE語法)。 要做到這一點,我想最簡單的方法是給pg_class添加一個觸發器,但是當我這樣做的時候,我得到了一個錯誤:
ERROR:Related TABLE。
ERROR: permission denied: "pg_class" 是一個系統目錄
下面是我的代碼
> docker run --name pg -e POSTGRES_PASSWORD=password postgres:13
> docker exec -ti pg psql -Upostgres
# then run this...
CREATE FUNCTION my_func() RETURNS trigger AS $元
BEGIN BEGIN
RAISE NOTICE 'This is a test';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER my_pg_trigger
AFTER INSERT ON pg_catalog.pg_class
FOR EACH ROW
WHEN (NEW.relkind = 'r'/span>)
EXECUTE FUNCTION my_func();
我沒有看到檔案中說你不能添加觸發器的內容。 我發現檔案中說它們是 "普通的表",然而編輯它們會嚴重擾亂事情。https://www.postgresql.org/docs/13/catalogs.html。 但是沒有關于權限或限制的內容。
PostgreSQL 的系統目錄是普通的表。你可以丟棄和重新創建表,添加列,插入和更新值,并以這種方式嚴重地擾亂你的系統。
如果這不可能,你能指給我看這方面的檔案以幫助我理解嗎? 更好的是,讓我知道是否有其他方法可以動態地將觸發器添加到表中?
uj5u.com熱心網友回復:
我沒有在pg_class表中添加觸發器,而是按照@Adrian Klaver和@a_horse_with_no_name的建議,用事件觸發器來解決這個問題。
CREATE OR REPLACE FUNCTION report() RETURNS event_trigger AS $元
DECLARE[/span
obj記錄。
rel_kind char;
BEGIN
如果tg_tag = 'CREATE TABLE' THEN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
回圈
SELECT relkind INTO rel_kind FROM pg_class WHERE oid = obj.objid。
--只記錄表(不包括索引)
如果rel_kind = 'r' THEN
RAISE NOTICE 'metric: %'/span>, obj.object_identity;
END IF;
END LOOP;
END IF;
END;
$$ LANGUAGE plpgsql;
創建EVENT TRIGGER report_trigger ON ddl_command_end EXECUTE FUNCTION report()。
對于那些需要用例的人來說:
假設你需要在創建表的時候做報告,你需要使用現有的資訊,并且不能使用pgbadger,或者類似的東西。 或者你想要更多的實時警報,并且不想等到日志在10分鐘或1小時的時間間隔內被匯總。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324752.html
標籤:
上一篇:PostGIS:函式ST_AsRaster并不存在。即使使用檔案中的例子
下一篇:需要幫助拆分數字值php
