Postgresql

如何在 PostgreSQL 中刪除我的所有函式?

  • February 14, 2022

現在我必須使用查詢來獲取文本文件中的命令。然後從它們中刪除雙引號。最後,在 psql shell 中執行該文件。

如何在一個步驟中刪除我在 PostgreSQL 中的所有函式?

刪除給定模式中的所有函式(包括聚合)(小心這個!):

Postgres 11 或更高版本

  • 增加了程序
  • 系統目錄pg_proc略有變化:prokind替換proisaggproiswindow- 並標記功能和新程序
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$;

引用自:https://dba.stackexchange.com/questions/122742