最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL批量修改函數(shù)擁有者的操作

 更新時間:2021年01月04日 11:10:42   作者:modestchen  
這篇文章主要介紹了PostgreSQL批量修改函數(shù)擁有者的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

本文演示的Postgresql版本如下:

PostgreSQL 9.6.8

相關視圖

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

視圖一: information_schema.routines

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

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

視圖二: information_schema.parameters

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

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

注意:可以通過routines. specific_name 和 parameters.specific_name字段關聯(lián)查詢。

單個修改

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

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

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

批量修改

首先可以查詢當前模式下函數(shù)的所有者分別是哪個用戶,使用下面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個無參函數(shù)和1個帶參函數(shù),擁有者都是postgres超級用戶。

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

SELECT 
"routines".specific_schema,
"routines".routine_name, 
COALESCE("parameters".parameter_name, '') AS parameter_name, -- COALESCE返回參數(shù)中的第一個非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;

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

WITH tmp AS (SELECT 
"routines".specific_schema,
"routines".routine_name, 
COALESCE("parameters".parameter_name, '') AS parameter_name, -- COALESCE返回參數(shù)中的第一個非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執(zhí)行代碼片段完成批量修改,完整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返回參數(shù)中的第一個非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已經(jīng)全部改為dbadmin這個賬號了。

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

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

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所有者

網(wǎng)上一個大神寫的

SELECT
‘a(chǎn)lter 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;

效果:

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

相關文章

  • postgresql關于like%xxx%的優(yōu)化操作

    postgresql關于like%xxx%的優(yōu)化操作

    這篇文章主要介紹了postgresql關于like%xxx%的優(yōu)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 如何查看postgres數(shù)據(jù)庫端口

    如何查看postgres數(shù)據(jù)庫端口

    這篇文章主要介紹了如何查看postgres數(shù)據(jù)庫端口操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSql 的hash_code函數(shù)的用法說明

    PostgreSql 的hash_code函數(shù)的用法說明

    這篇文章主要介紹了PostgreSql 的hash_code函數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL進行重置密碼的方法小結(jié)

    PostgreSQL進行重置密碼的方法小結(jié)

    今天想測試一個PostgresSQL語法的 SQL,但是打開PostgresSQL之后沉默了,密碼是什么?日長月久的,漸漸就忘記了,于是開始了尋找密碼的道路,所以本文介紹了Postgresql忘記密碼,如何重置密碼,需要的朋友可以參考下
    2024-05-05
  • Postgres copy命令導入導出數(shù)據(jù)的操作方法

    Postgres copy命令導入導出數(shù)據(jù)的操作方法

    最近有需要對數(shù)據(jù)進行遷移的需求,由于postgres性能的關系,單表3000W的數(shù)據(jù)量查詢起來有一些慢,需要對大表進行切割,拆成若干個子表,涉及到原有數(shù)據(jù)要遷移到子表的需求,這篇文章主要介紹了Postgres copy命令導入導出數(shù)據(jù)的操作方法,需要的朋友可以參考下
    2024-08-08
  • postgresql 刪除重復數(shù)據(jù)的幾種方法小結(jié)

    postgresql 刪除重復數(shù)據(jù)的幾種方法小結(jié)

    這篇文章主要介紹了postgresql 刪除重復數(shù)據(jù)的幾種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • postgresql 獲取兩個時間類型小時差值案例

    postgresql 獲取兩個時間類型小時差值案例

    這篇文章主要介紹了postgresql 獲取兩個時間類型小時差值案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL教程(十一):服務器配置

    PostgreSQL教程(十一):服務器配置

    這篇文章主要介紹了PostgreSQL教程(十一):服務器配置,本文講解了服務器進程的啟動和關閉、服務器配置、內(nèi)存相關的參數(shù)配置等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • Windows版?PostgreSQL?利用?pg_upgrade?進行大版升級操作方法

    Windows版?PostgreSQL?利用?pg_upgrade?進行大版升級操作方法

    最近?PostgreSQL?15?版本正式發(fā)布了,新版本的各種特性和好處本文就不展開介紹了,主要介紹一下?Windows?環(huán)境下?PostgreSQL?大版本升級的方法,我們現(xiàn)在的幾個數(shù)據(jù)庫都是運行在?Windows服務器的?PostgreSQL?14,需要的朋友可以參考下
    2022-10-10
  • PostgreSQL 允許遠程訪問設置的操作

    PostgreSQL 允許遠程訪問設置的操作

    這篇文章主要介紹了PostgreSQL 允許遠程訪問設置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

开化县| 海口市| 霞浦县| 九江县| 滦平县| 吉林省| 体育| 香格里拉县| 嘉祥县| 富川| 乐业县| 美姑县| 拉孜县| 青阳县| 绥芬河市| 嘉祥县| 屏南县| 根河市| 大名县| 清水河县| 滕州市| 广宁县| 大化| 迁安市| 体育| 曲阳县| 美姑县| 弥渡县| 射洪县| 应用必备| 都昌县| 沂水县| 安义县| 临汾市| 左贡县| 孙吴县| 固始县| 麻栗坡县| 丹江口市| 沅陵县| 手机|