婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PostgreSQL批量修改函數擁有者的操作

PostgreSQL批量修改函數擁有者的操作

熱門標簽:打電話智能電銷機器人授權 外呼調研系統 地圖標注和圖片名稱的區別 漯河外呼電話系統 重慶自動外呼系統定制 海豐有多少商家沒有地圖標注 美容工作室地圖標注 合肥公司外呼系統運營商 辦公外呼電話系統

Postgresql如何批量修改函數擁有者,默認創建的函數對象的擁有者為當前創建的用戶,如果使用postgres超級管理員創建一個test()的函數,擁有者就是postgres用戶。下面講解下如何批量修改擁有者。

本文演示的Postgresql版本如下:

PostgreSQL 9.6.8

相關視圖

要查詢Postgresql的函數和函數參數需要使用函數視圖和參數視圖,分別記錄了函數信息和參數列表信息。

視圖一: information_schema.routines

視圖routines包含當前數據庫中所有的函數。只有那些當前用戶能夠訪問(作為擁有者或具有某些特權)的函數才會被顯示。需要用到的列如下,完整視圖講解請參考官方文檔。

名稱 數據類型 備注
specific_schema sql_identifier 包含該函數的模式名
routine_name sql_identifier 該函數的名字(在重載的情況下可能重復)
specific_name sql_identifier 該函數的"專用名"。這是一個在模式中唯一標識該函數的名稱,即使該函數真正的名稱已經被重載。專用名的格式尚未被定義,它應當僅被用來與指定例程名稱的其他實例進行比較。

視圖二: information_schema.parameters

視圖parameters包含當前數據庫中所有函數的參數的有關信息。只有那些當前用戶能夠訪問(作為擁有者或具有某些特權)的函數才會被顯示。需要用到的列如下,完整視圖講解請參考官方文檔。

名稱 數據類型 備注
parameter_name sql_identifier 參數名,如果參數沒有名稱則為空
udt_name sql_identifier 該參數的數據類型的名字
ordinal_position cardinal_number 該參數在函數參數列表中的順序位置(從 1 開始計數)
specific_name cardinal_number 該函數的"專用名"。詳見第 35.40 節。

注意:可以通過routines. specific_name 和 parameters.specific_name字段關聯查詢。

單個修改

如果需要修改的函數只有一個,請執行如下SQL語句即可:

如果需要修改的函數只有一個,請執行如下SQL語句即可:

// 無參數函數
ALTER FUNCTION "abc"."test"() OWNER TO "dbadmin";
//帶參數函數
ALTER FUNCTION "abc"."test3"(p1 varchar, p2 varchar) OWNER TO "dbadmin";

批量修改

首先可以查詢當前模式下函數的所有者分別是哪個用戶,使用下面SQL來查詢:

SELECT 
n.nspname as "Schema",
p.proname as "Name",
pg_catalog.pg_get_function_result(p.oid) as "Result data type",
pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
pg_catalog.pg_get_userbyid(p.proowner) as "Owner"
FROM pg_catalog.pg_proc p
  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
  LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang
WHERE pg_catalog.pg_function_is_visible(p.oid)
  AND n.nspname > 'pg_catalog'
  AND n.nspname > 'information_schema'
ORDER BY 1, 2;

當前顯示模式“abc”有2個無參函數和1個帶參函數,擁有者都是postgres超級用戶。

然后根據上面講的兩個視圖: routines 和 parameters關聯查詢出模式下的所有函數和參數(目的是為了拼接SQL語句),參考如下:

SELECT 
"routines".specific_schema,
"routines".routine_name, 
COALESCE("parameters".parameter_name, '') AS parameter_name, -- COALESCE返回參數中的第一個非null的值
COALESCE("parameters".udt_name, '') AS udt_name,
COALESCE("parameters".parameter_name, '') || ' ' || COALESCE("parameters".udt_name, '') AS params,
"parameters".ordinal_position 
FROM "information_schema"."routines"
LEFT JOIN "information_schema"."parameters" ON "routines".specific_name="parameters".specific_name 
WHERE "routines".specific_schema='abc' 
ORDER BY 1,2,6;

這里我們再使用聚合函數: string_agg 把字段 params所有行連接成字符串,并用逗號分隔符分隔。

WITH tmp AS (SELECT 
"routines".specific_schema,
"routines".routine_name, 
COALESCE("parameters".parameter_name, '') AS parameter_name, -- COALESCE返回參數中的第一個非null的值
COALESCE("parameters".udt_name, '') AS udt_name,
COALESCE("parameters".parameter_name, '') || ' ' || COALESCE("parameters".udt_name, '') AS params,
"parameters".ordinal_position 
FROM "information_schema"."routines"
LEFT JOIN "information_schema"."parameters" ON "routines".specific_name="parameters".specific_name 
WHERE "routines".specific_schema='abc' 
ORDER BY 1,2,6) 
SELECT 
specific_schema, 
routine_name, 
string_agg(params, ',') AS params, 
'"'||specific_schema||'"."'||routine_name||'"('||string_agg(params, ',')||')' AS fname 
FROM tmp GROUP BY specific_schema, routine_name; 

最后使用一個Postgres執行代碼片段完成批量修改,完整SQL如下:

DO $$
DECLARE r record;
BEGIN
FOR r IN
WITH tmp AS (SELECT 
"routines".specific_schema,
"routines".routine_name, 
COALESCE("parameters".parameter_name, '') AS parameter_name, -- COALESCE返回參數中的第一個非null的值
COALESCE("parameters".udt_name, '') AS udt_name,
COALESCE("parameters".parameter_name, '') || ' ' || COALESCE("parameters".udt_name, '') AS params,
"parameters".ordinal_position 
FROM "information_schema"."routines"
LEFT JOIN "information_schema"."parameters" ON "routines".specific_name="parameters".specific_name 
WHERE "routines".specific_schema='abc' 
ORDER BY 1,2,6) SELECT '"'||specific_schema||'"."'||routine_name||'"('||string_agg(params, ',')||')' AS fname FROM tmp GROUP BY specific_schema, routine_name
LOOP
EXECUTE 'ALTER FUNCTION '|| r.fname||' OWNER TO "dbadmin" ';
END LOOP;
END $$;

可以看到模式“abc”的Owner已經全部改為dbadmin這個賬號了。

上次批量修改函數可能存在部分特殊場景會報錯, 會把“參數類型” + “返回類型” 拼接在一起

改進方法:我們通過pg_catalog目錄來實現批量修改,參考代碼如下:

DO $$
DECLARE r record;
BEGIN
FOR r IN
 WITH tmp AS (
 SELECT n.nspname as "Schema",
 p.proname as "Name",
 pg_catalog.pg_get_function_result(p.oid) as "Result data type",
 pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
 CASE
 WHEN p.proisagg THEN 'agg'
 WHEN p.proiswindow THEN 'window'
 WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
 ELSE 'normal'
 END as "Type"
 FROM pg_catalog.pg_proc p
  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
 WHERE n.nspname = 'etl'
 ORDER BY 1, 2, 4
 ) SELECT '"' || "Schema" || '"' || '.' || '"' || "Name" || '"' || '(' || "Argument data types" ||')' AS fname FROM tmp
LOOP
EXECUTE 'ALTER FUNCTION '|| r.fname||' OWNER TO "postgres" ';
END LOOP;
END $$;

補充:PostgreSQL更改Owner所有者

網上一個大神寫的

SELECT
‘alter table ' || nsp.nspname || ‘.' || cls.relname || ' owner to usr_zhudong;' || chr ( 13 )
FROM
pg_catalog.pg_class cls,
pg_catalog.pg_namespace nsp
WHERE
nsp.nspname IN ( ‘public' )
AND cls.relnamespace = nsp.oid
AND cls.relkind = ‘r'
ORDER BY
nsp.nspname,
cls.relname;

我來做一個改版

SELECT
'alter table ' || nsp.nspname || '.' || cls.relname || ' owner to test2;' || chr ( 13 )
FROM
pg_catalog.pg_class cls,
pg_catalog.pg_namespace nsp
WHERE
nsp.nspname IN ( 'public' )
AND cls.relnamespace = nsp.oid
AND cls.relkind = 'r'
ORDER BY
nsp.nspname,
cls.relname;
 
SELECT
'alter table "' || nsp.nspname || '"."' || cls.relname || '" owner to user01;' || chr ( 13 )
FROM
pg_catalog.pg_class cls,
pg_catalog.pg_namespace nsp
WHERE
nsp.nspname IN ( 'public' )
AND cls.relnamespace = nsp.oid
AND cls.relkind = 'r'
ORDER BY
nsp.nspname,
cls.relname;

效果:

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Postgresql去重函數distinct的用法說明
  • PostgreSQL 定義返回表函數的操作
  • PostgreSQL的generate_series()函數的用法說明
  • postgresql合并string_agg函數的實例
  • PostgreSQL數據類型格式化函數操作
  • 在postgresql數據庫中判斷是否是數字和日期時間格式函數操作
  • Postgresql自定義函數詳解
  • postgresql 循環函數的簡單實現操作

標簽:烏海 晉城 衡陽 錦州 株洲 蚌埠 珠海 來賓

巨人網絡通訊聲明:本文標題《PostgreSQL批量修改函數擁有者的操作》,本文關鍵詞  PostgreSQL,批量,修改,函數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PostgreSQL批量修改函數擁有者的操作》相關的同類信息!
  • 本頁收集關于PostgreSQL批量修改函數擁有者的操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕av一区二区三区免费看| 亚洲欧美另类久久久精品2019| 久久综合狠狠综合久久激情| 亚洲欧美自拍偷拍| 麻豆成人av在线| 一本到一区二区三区| 久久久精品综合| 日韩精品欧美精品| 高清成人免费视频| 精品国产电影一区二区| 亚洲成人中文在线| 国产成人精品1024| 日韩亚洲欧美高清| 亚洲国产另类av| 成年人网站91| 国产精品水嫩水嫩| 国产在线播精品第三| 欧美一区日韩一区| 亚洲裸体xxx| 国产福利一区在线| 日韩欧美国产一二三区| 日韩精品一级二级 | 欧美日韩精品系列| 亚洲美女视频在线观看| 97超碰欧美中文字幕| 国产亚洲污的网站| 激情丁香综合五月| 精品国产乱码久久久久久蜜臀| 五月天视频一区| 欧美军同video69gay| 亚洲综合自拍偷拍| 欧美在线你懂得| 亚洲福利视频一区二区| 欧美日韩中文字幕一区二区| 午夜精品在线看| 欧美日韩国产天堂| 日本在线不卡视频| 欧美变态凌虐bdsm| 国产精品影视在线观看| 2023国产精品| 国产成人午夜精品影院观看视频 | 日本麻豆一区二区三区视频| 欧美中文字幕亚洲一区二区va在线| 综合亚洲深深色噜噜狠狠网站| 成人激情校园春色| 一区二区三区在线视频播放| 在线观看不卡一区| 午夜久久久久久久久久一区二区| 6080亚洲精品一区二区| 六月婷婷色综合| 精品动漫一区二区三区在线观看| 国内成+人亚洲+欧美+综合在线| 欧美大片一区二区三区| 国产91精品免费| 亚洲欧洲日韩av| 日韩一区二区三区高清免费看看| 久久66热re国产| 中文字幕一区二区三区色视频 | 精彩视频一区二区| 中文字幕在线免费不卡| 欧美影院精品一区| 激情六月婷婷久久| 亚洲精品视频一区| 欧美一级久久久久久久大片| 国产乱理伦片在线观看夜一区| 国产精品高潮呻吟久久| 欧美日韩一区三区四区| 狠狠色2019综合网| 一区二区三区国产精华| 7777精品伊人久久久大香线蕉| 国产乱人伦偷精品视频免下载| 一区二区三区美女视频| 欧美mv和日韩mv国产网站| 成人黄色软件下载| 日本欧洲一区二区| 亚洲日本va在线观看| 日韩小视频在线观看专区| 国产成人综合在线播放| 亚洲成人免费看| 久久久午夜精品理论片中文字幕| 欧美综合视频在线观看| 国产麻豆精品久久一二三| 亚洲国产婷婷综合在线精品| 国产欧美一区二区精品性色| 欧美日韩高清一区二区不卡| 国产精品亚洲成人| 日本欧美大码aⅴ在线播放| 综合色中文字幕| 国产日韩欧美一区二区三区乱码| 欧美精品在线视频| 色视频一区二区| 成av人片一区二区| 国产69精品久久久久777| 麻豆91精品视频| 天天操天天干天天综合网| ●精品国产综合乱码久久久久| 久久久三级国产网站| 91精品一区二区三区久久久久久| 97超碰欧美中文字幕| 成人免费看的视频| 高清久久久久久| 成人av一区二区三区| 国产精品亚洲午夜一区二区三区| 久久激情五月激情| 久久97超碰国产精品超碰| 免费成人在线网站| 日韩成人免费在线| 美国十次综合导航| 麻豆精品一区二区综合av| 性做久久久久久| 日本最新不卡在线| 久久精品国产色蜜蜜麻豆| 强制捆绑调教一区二区| 麻豆成人久久精品二区三区红 | eeuss国产一区二区三区| 国产高清无密码一区二区三区| 国产suv精品一区二区883| 美女一区二区在线观看| 秋霞午夜av一区二区三区| 亚洲成在人线免费| 依依成人精品视频| 中文字幕一区免费在线观看| 亚洲欧美激情插| 中文字幕一区日韩精品欧美| 国产日韩精品一区二区三区| 久久综合色一综合色88| 欧美日韩一区二区在线观看| 欧洲色大大久久| 色哟哟一区二区在线观看| 99久久伊人精品| 91婷婷韩国欧美一区二区| 欧美三级三级三级| 欧美日韩中文一区| 欧美日韩国产首页| 欧美一级片免费看| 欧美日韩一区在线| 国产日韩欧美麻豆| 中文字幕一区二区三区四区| **性色生活片久久毛片| 亚洲区小说区图片区qvod| 午夜精品久久久久久久久久久| 亚洲大片免费看| 免费av网站大全久久| 美女视频黄a大片欧美| 日韩成人免费在线| 国产91丝袜在线18| 91免费观看在线| 欧美三级日韩三级国产三级| 91精品欧美一区二区三区综合在| 色丁香久综合在线久综合在线观看| 91麻豆精品国产91久久久久久久久| 日韩视频永久免费| 中文字幕av一区二区三区免费看 | 久久久久亚洲综合| 一区二区三区四区在线| 亚洲国产精品久久人人爱| 青青青伊人色综合久久| 激情深爱一区二区| 黑人精品欧美一区二区蜜桃| 欧美性猛交xxxx乱大交退制版| 91精品国产91久久综合桃花| 精品捆绑美女sm三区| 亚洲人123区| 激情综合色综合久久| 成人av免费在线| 欧美日产国产精品| 国产午夜精品在线观看| 国产精品蜜臀在线观看| 久久99精品国产| av日韩在线网站| 欧美成人免费网站| 亚洲黄色小视频| 成人免费视频网站在线观看| 91精品中文字幕一区二区三区| 国产欧美一区二区精品忘忧草| 亚洲精品免费播放| 国产一区二区三区| 欧美三级中文字幕| 亚洲国产精品成人综合 | 白白色 亚洲乱淫| 日韩免费看网站| 亚洲一区二区在线免费看| 国产精品69毛片高清亚洲| 欧洲激情一区二区| 欧美国产一区视频在线观看| 精品中文字幕一区二区| 欧美三级在线视频| 亚洲一区二区三区四区五区黄 | 91国产丝袜在线播放| 久久久精品2019中文字幕之3| 午夜在线成人av| aa级大片欧美| 久久精品无码一区二区三区| 青青草原综合久久大伊人精品 | 色综合久久久久久久久| 国产片一区二区三区| 精品一区二区三区在线观看| 色婷婷综合久久久久中文| 国产精品午夜在线| 国产91对白在线观看九色|