【问题标题】:Can you copy table privileges from one table to another in postgresql?您可以在 postgresql 中将表权限从一个表复制到另一个表吗?
【发布时间】:2015-02-02 16:06:03
【问题描述】:

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

CREATE TABLE TOTABLE (LIKE FROMTABLE INCLUDING INDEXES)

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

【问题讨论】:

标签: sql postgresql


【解决方案1】:

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

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

目录pg_shdepend记录了两者之间的依赖关系 数据库对象和共享对象,例如角色。这条信息 允许 PostgreSQL 确保之前未引用这些对象 试图删除它们。

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

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


已过时,请勿使用:

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 的强制转换会确定地选择一个表,即使没有模式限定。详情:

  • 如果未找到其中一个表,则会立即出现异常(转换为 regclass 失败)。
    如果未找到 from_table,@Robert 的查询会很高兴地将 relacl 设置为 NULL。

【讨论】:

    【解决方案2】:

    关于 postgresql 中表的信息存储在 pg_class 表中。包含表权限的字段是relacl

    所以类似下面的东西会起作用:

    update pg_class set relacl = (select relacl from pg_class where relname = 'from_table') where relname='to_table';

    请注意,pg_class 具有所有表的元数据 - 因此您还应注意确保使用正确的架构 (relnamespace),以防多个架构中存在同名的表。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 2022-01-25
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多