【问题标题】:PostgreSQL copy permissions from another tablePostgreSQL 从另一个表复制权限
【发布时间】:2010-12-21 19:44:38
【问题描述】:

是否可以将用户权限从 PostgreSQL 数据库中的一个表复制到另一个表?是否只是将目标表的 pg_class.relacl 列值更新为源表的值,如:

UPDATE pg_class
SET relacl=(SELECT relacl FROM pg_class WHERE relname='source_table')
WHERE relname='target_table';

这似乎可行,但我是否遗漏了其他可能需要完成的事情或使用此方法的其他“陷阱”?

提前感谢您的任何回复。

【问题讨论】:

    标签: postgresql database-permissions


    【解决方案1】:

    pg_dump 方法既好又简单,但是,它不适用于其他模式中的表,因为输出不使用模式名称限定表。相反,它会生成:

    SET search_path = foo, pg_catalog;
    ...
    GRANT SELECT ON foo_table to foo_user;
    

    并且将无法向不存在的public.foo_table 关系授予权限。

    另外,如果你在不同的模式中有同名的关系,你需要确保你只重命名指定模式中的表。我开始在上面编写一个 bash 脚本来解决这个问题,但它开始变得有点笨拙,所以我改用 perl。

    用法:transfer-acl old-qualified-relation=new-qualified-relation

    例如transfer-acl foo.foo_table=foo.bar_table 会将foo.foo_table 上的授权应用到foo.bar_table。我没有实现任何 REVOKE 重写,因为我无法获得转储以发出任何内容。

    #! /usr/bin/perl
    
    use strict;
    use warnings;
    
    my %rename = map {(split '=')} @ARGV;
    
    open my $dump, '-|', qw(pg_dump customer -s), map {('-t', $_)} keys %rename
        or die "Cannot open pipe from pg_dump: $!\n";
    
    my $schema = 'public';
    while (<$dump>) {
        if (/^SET search_path = (\w+)/) {
            $schema = $1;
        }
        elsif (/^(GRANT .*? ON TABLE )(\w+)( TO (?:[^;]+);)$/) {
            my $fq_table = "$schema." . $2; # fully-qualified schema.table
            print "$1$rename{$fq_table}$3\n" if exists $rename{$fq_table};
        }
    }
    

    将此结果传递给psql,然后您就设置好了。

    【讨论】:

      【解决方案2】:

      如果您可以使用命令行而不是 SQL,那么更安全的方法是使用 pg_dump:

      pg_dump dbname -t oldtablename -s \
      | egrep '^(GRANT|REVOKE)' \
      | sed 's/oldtablename/newtablename/' \
      | psql dbname
      

      我假设一个 unix 服务器。在 Windows 上,我将 pg_dump -s 用于文件,手动编辑它,然后将其导入数据库。

      也许您还需要复制此表拥有的序列的权限 - pg_dump 可以工作。

      【讨论】:

        猜你喜欢
        • 2015-02-02
        • 2013-05-16
        • 2011-05-18
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2012-06-13
        • 1970-01-01
        相关资源
        最近更新 更多