Postgresql
如何在 PostgreSQL 中刪除我的所有函式?
現在我必須使用查詢來獲取文本文件中的命令。然後從它們中刪除雙引號。最後,在 psql shell 中執行該文件。
如何在一個步驟中刪除我在 PostgreSQL 中的所有函式?
刪除給定模式中的所有函式(包括聚合)(小心這個!):
Postgres 11 或更高版本
- 增加了程序。
- 系統目錄
pg_proc
略有變化:prokind
替換proisagg
和proiswindow
- 並標記功能和新程序DO $do$ DECLARE _sql text; BEGIN SELECT INTO _sql string_agg(format('DROP %s %s;' , CASE prokind WHEN 'f' THEN 'FUNCTION' WHEN 'a' THEN 'AGGREGATE' WHEN 'p' THEN 'PROCEDURE' WHEN 'w' THEN 'FUNCTION' -- window function (rarely applicable) -- ELSE NULL -- not possible in pg 11 END , oid::regprocedure) , E'\n') FROM pg_proc WHERE pronamespace = 'public'::regnamespace -- schema name here! -- AND prokind = ANY ('{f,a,p,w}') -- optionally filter kinds ; IF _sql IS NOT NULL THEN RAISE NOTICE '%', _sql; -- debug / check first -- EXECUTE _sql; -- uncomment payload once you are sure ELSE RAISE NOTICE 'No fuctions found in schema %', quote_ident(_schema); END IF; END $do$;
在這種情況下,模式名稱區分大小寫。
執行角色當然需要具有必要的權限。
您可能會
CASCADE
像 mehmet 展示的那樣添加,但這也會遞歸地刪除依賴對象 - 而不僅僅是函式。讓它變得更加危險。你最好確切地知道你在做什麼。相關,有更多解釋:
Postgres 10 或以上
DO $do$ DECLARE _sql text; BEGIN SELECT INTO _sql string_agg(format('DROP %s %s;' , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END , oid::regprocedure) , E'\n') FROM pg_proc WHERE pronamespace = 'public'::regnamespace; -- schema name here! IF _sql IS NOT NULL THEN RAISE NOTICE '%', _sql; -- debug / check first -- EXECUTE _sql; -- uncomment payload once you are sure ELSE RAISE NOTICE 'No fuctions found in schema %', quote_ident(_schema); END IF; END $do$;