gpt4 book ai didi

sql - 您可以在 PostgreSQL 中将表权限从一个表复制到另一个表吗?

转载 作者:行者123 更新时间:2023-11-29 11:43:12 26 4
gpt4 key购买 nike

我有一个导入过程,它使用下面的代码复制一个表架构,然后用数据填充该表。但是,它不会复制授予的角色。

CREATE TABLE TOTABLE (LIKE FROMTABLE INCLUDING INDEXES)

有没有一种方法可以在复制模式时复制权限,或者我可以在之后从“FROMTABLE”应用权限?

最佳答案

直接操作目录表时非常小心。通常建议专门使用 DDL 语句。目录表不应该由用户编写。如果你搞砸了,你的数据库集群可能会损坏到无法修复的地步。您已收到警告。

更新:事实证明,上面的警告是正确的。这从一开始就是个坏主意。标准 GRANT/REVOKE 命令(以及 default privilege system )也在 pg_shdepend 中创建条目表来记住访问控制列表中提到的对象和角色之间的依赖关系(所有者除外,无论如何都是链接的)。 The manual:

The catalog pg_shdepend records the dependency relationships betweendatabase objects and shared objects, such as roles. This informationallows PostgreSQL to ensure that those objects are unreferenced beforeattempting to delete them.

通过直接操作访问控制列表(relacl 用于关系),依赖关系会失去同步,这可能会在稍后尝试删除角色时导致“奇怪”的问题。

最近有一个discussion about "Copying Permissions" on pgsql-hackers (2016 年 11 月),但尚未实现。

不完整的解决方案(不要使用!)

query presented by @Robert有一个错误(正如他指出的那样):relname 不是唯一的。在同一个数据库的多个模式中可以有任意数量的同名表。修复:

UPDATE pg_class c_to
SET relacl = c_from.relacl
FROM pg_class c_from
WHERE c_from.oid = 'public.from_table'::regclass
AND c_to.oid = 'public.to_table'::regclass

差异

  • regclass 的转换会确定性地选择一个表,即使没有模式限定。详情:

  • How do I speed up counting rows in a PostgreSQL table?

  • 如果未找到其中一个表,您会立即收到异常(转换为 regclass 失败)。
    如果找不到 from_table,@Robert 的查询很乐意将 relacl 设置为 NULL。

关于sql - 您可以在 PostgreSQL 中将表权限从一个表复制到另一个表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com