中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在PostgreSQL中對函數的擁有者進行修改

發布時間:2021-01-04 16:19:52 來源:億速云 閱讀:393 作者:Leah 欄目:開發技術

本篇文章為大家展示了怎么在PostgreSQL中對函數的擁有者進行修改,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

怎么在PostgreSQL中對函數的擁有者進行修改

本文演示的Postgresql版本如下:

PostgreSQL 9.6.8

相關視圖

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

視圖一: information_schema.routines

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

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

視圖二: information_schema.parameters

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

名稱數據類型備注
parameter_namesql_identifier參數名,如果參數沒有名稱則為空
udt_namesql_identifier該參數的數據類型的名字
ordinal_positioncardinal_number該參數在函數參數列表中的順序位置(從 1 開始計數)
specific_namecardinal_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超級用戶。

怎么在PostgreSQL中對函數的擁有者進行修改

然后根據上面講的兩個視圖: 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;

怎么在PostgreSQL中對函數的擁有者進行修改

這里我們再使用聚合函數: 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;

怎么在PostgreSQL中對函數的擁有者進行修改

最后使用一個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這個賬號了。

怎么在PostgreSQL中對函數的擁有者進行修改

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

改進方法:我們通過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中對函數的擁有者進行修改

上述內容就是怎么在PostgreSQL中對函數的擁有者進行修改,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南澳县| 民乐县| 弥渡县| 双江| 凤山市| 浦县| 汤阴县| 莎车县| 蒙自县| 正蓝旗| 商丘市| 邛崃市| 灌云县| 淮滨县| 小金县| 信宜市| 南充市| 江油市| 梧州市| 邓州市| 滕州市| 闽侯县| 上虞市| 达拉特旗| 西丰县| 江城| 遂平县| 突泉县| 宜兰市| 北碚区| 长岭县| 宿州市| 二手房| 南丹县| 黔东| 宜丰县| 定结县| 泗水县| 延长县| 徐州市| 长沙市|