本篇文章为大家展示了怎么在PostgreSQL中对函数的拥有者进行修改,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
PostgreSQL如何批量修改函数拥有者,默认创建的函数对象的拥有者为当前创建的用户,如果使用postgres超级管理员创建一个测试()的函数,拥有者就是postgres用户。下面讲解下如何批量修改拥有者。
本文演示的PostgreSQL版本如下:
PostgreSQL 9.6.8
相关视图
要查询PostgreSQL的函数和函数参数需要使用函数视图和参数视图,分别记录了函数信息和参数列表信息。
视图一:information_schema.routines
视图程序包含当前数据库中所有的函数。只有那些当前用户能够访问(作为拥有者或具有某些特权)的函数才会被显示。需要用到的列如下,完整视图讲解请参考官方文档。
名称数据类型备注specific_schemasql_identifier包含该函数的模式名routine_namesql_identifier该函数的名字(在重载的情况下可能重复)specific_namesql_identifier该函数的“专用名“。这是一个在模式中唯一标识该函数的名称,即使该函数真正的名称已经被重载。专用名的格式尚未被定义,它应当仅被用来与指定例程名称的其他实例进行比较。视图二:information_schema。参数
视图参数包含当前数据库中所有函数的参数的有关信息。只有那些当前用户能够访问(作为拥有者或具有某些特权)的函数才会被显示。需要用到的列如下,完整视图讲解请参考官方文档。
名称数据类型备注parameter_namesql_identifier参数名,如果参数没有名称则为空udt_namesql_identifier该参数的数据类型的名字ordinal_positioncardinal_number该参数在函数参数列表中的顺序位置(从1开始计数)specific_namecardinal_number该函数的“专用名“。详见第35.40节。注意:可以通过例程。specific_name和参数。specific_name字段关联查询。
单个修改
如果需要修改的函数只有一个,请执行如下SQL语句即可:
如果需要修改的函数只有一个,请执行如下SQL语句即可:
//,无参数函数 ALTER FUNCTION “abc" !”test" (), OWNER 用“dbadmin";//带参数函数 ALTER FUNCTION “abc" !”test3" (p1 varchar, p2 varchar), OWNER 用“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 “称 得到pg_catalog.pg_proc p LEFT 才能JOIN pg_catalog.pg_namespace  n 提醒n.oid =p.pronamespace LEFT 才能JOIN pg_catalog.pg_language  l 提醒l.oid =p.prolang WHERE pg_catalog.pg_function_is_visible (p.oid) 以及才能n.nspname & lt;祝辞,& # 39;pg_catalog& # 39; 以及才能n.nspname & lt;祝辞,& # 39;information_schema& # 39; ORDER BY 1,, 2,
当前显示模式“abc”有2个无参函数和1个带参函数,拥有者都是postgres超级用户。
然后根据上面讲的两个视图:例程和参数关联查询出模式下的所有函数和参数(目的是为了拼接SQL语句),参考如下:
SELECT “routines" .specific_schema, “routines" .routine_name,, 合并(“parameters" .parameter_name, & # 39; & # 39;), AS parameter_name,,,,合并返回参数中的第一个非零的值 合并(“parameters" .udt_name, & # 39; & # 39;), AS udt_name, 合并(“parameters" .parameter_name, & # 39; & # 39;), | |, & # 39;, & # 39;, | |,合并(“parameters" .udt_name, & # 39; & # 39;), AS 参数, “parameters" .ordinal_position 得到“information_schema" !”routines" LEFT JOIN “information_schema" !”parameters",提醒“routines" .specific_name=皃arameters" .specific_name WHERE “routines" .specific_schema=& # 39; abc # 39;, ORDER BY 1、2、6;怎么在PostgreSQL中对函数的拥有者进行修改