Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql ( “创建表”, “将表创建为”, “创建视图”, “创建物化视图”, “创建函数” )执行过程reset_privileges();_Postgresql - Fatal编程技术网

Postgresql ( “创建表”, “将表创建为”, “创建视图”, “创建物化视图”, “创建函数” )执行过程reset_privileges();

Postgresql ( “创建表”, “将表创建为”, “创建视图”, “创建物化视图”, “创建函数” )执行过程reset_privileges();,postgresql,Postgresql,该函数检查新创建的对象是否在公共架构中,并最终从用户管理器撤销所有不需要的特权 它甚至懒得过滤那些对象,而是撤销了公共模式中所有表s、视图s和函数s的特权。当然,可以使用提供的object\u identity字段和函数内部更精细的逻辑轻松定制它。根据: 每个架构指定的默认权限将添加到特定对象类型的全局默认权限中。这意味着,如果全局授予每个架构的权限(默认情况下,或者根据以前未指定架构的alterdefaultprivileges命令),则无法撤消这些权限。每模式撤销仅用于撤销前一个每模式授予的

该函数检查新创建的对象是否在
公共
架构中,并最终从用户
管理器
撤销所有不需要的特权

它甚至懒得过滤那些对象,而是撤销了
公共
模式中
所有
s、
视图
s和
函数
s的特权。当然,可以使用提供的
object\u identity
字段和函数内部更精细的逻辑轻松定制它。

根据:

每个架构指定的默认权限将添加到特定对象类型的全局默认权限中。这意味着,如果全局授予每个架构的权限(默认情况下,或者根据以前未指定架构的
alterdefaultprivileges
命令),则无法撤消这些权限。每模式
撤销
仅用于撤销前一个每模式
授予
的效果

(在该手册页面给出的示例中,这一点更加明确。)

因此,我认为正在发生的是,在脚本的步骤5中,您正在设置默认权限,以便在所有模式的表上授予
DELETE
(作为全局默认):

ALTER默认权限向管理员授予插入、更新、删除表的权限;
但在步骤7中,您将从
public
模式中撤销。此撤销对全局授予没有影响,因此仍将授予
删除
(和其他)权限:

ALTER SCHEMA public中的默认权限从管理器中撤销对表的插入、更新和删除;
我想我要么(a)咬紧牙关,为每个模式添加默认权限(这不是“触发并忘记”,而是更明确的),要么(b)质疑为什么我需要
公共
模式存在,旨在删除它以简化这种情况。

根据:

每个架构指定的默认权限将添加到特定对象类型的全局默认权限中。这意味着,如果全局授予每个架构的权限(默认情况下,或者根据以前未指定架构的
alterdefaultprivileges
命令),则无法撤消这些权限。每模式
撤销
仅用于撤销前一个每模式
授予
的效果

(在该手册页面给出的示例中,这一点更加明确。)

因此,我认为正在发生的是,在脚本的步骤5中,您正在设置默认权限,以便在所有模式的表上授予
DELETE
(作为全局默认):

ALTER默认权限向管理员授予插入、更新、删除表的权限;
但在步骤7中,您将从
public
模式中撤销。此撤销对全局授予没有影响,因此仍将授予
删除
(和其他)权限:

ALTER SCHEMA public中的默认权限从管理器中撤销对表的插入、更新和删除;

我想我要么(a)咬紧牙关,为每个模式添加默认权限(这不是“触发并忘记”,而是更明确的),要么(b)质疑为什么我需要
public
模式存在,旨在删除它以简化这种情况。

是的,你说得对。似乎我完全错过了文档中的那一段。。。删除一个“公共”模式(它可以像任何东西一样命名)不是一个选项,因为我显然需要一些跨数据库的“共享”对象(函数、表等)。另一个使用事件触发器的解决方案可能与我的方法相反:使用函数在创建模式时设置默认权限,同时删除数据库范围的默认权限。我不知道哪一个会是“更干净”的。也许只是偏好的问题。是的,你是对的。似乎我完全错过了文档中的那一段。。。删除一个“公共”模式(它可以像任何东西一样命名)不是一个选项,因为我显然需要一些跨数据库的“共享”对象(函数、表等)。另一个使用事件触发器的解决方案可能与我的方法相反:使用函数在创建模式时设置默认权限,同时删除数据库范围的默认权限。我不知道哪一个会是“更干净”的。也许只是偏好的问题。
admin    Owner of the database. Used to manipulate the STRUCTURE of the database (CREATE, DROP, TRUNCATE...)
manager  Used for DATA manipulation (INSERT, UPDATE, DELETE)
reader   Used to read DATA (basically SELECT)