账号权限详情

本文介绍RDS PostgreSQL高权限账号和普通账号的权限详情。

权限说明

重要

为了保障数据库的安全和稳定性,RDS PostgreSQL中的数据库账号未被授予对pg_authid表的访问权限。您可以通过使用pg_roles视图来查询数据库角色的信息。

普通账号

RDS PostgreSQL的普通账号权限和社区的非superuser账号的权限相同。具体请参见PostgreSQL官方文档

高权限账号

RDS PostgreSQL的高权限账号除了支持普通账号的所有权限外,还支持以下权限:

  • 在两阶段提交中,可以完成任何已准备的事务。

    说明
    • 当涉及到多个数据库或系统之间的事务处理时,为了确保数据的一致性,常常使用两阶段提交(Two-Phase Commit)协议。这个协议确保所有相关的事务要么全部提交(完成),要么全部回滚(取消)。

    • 更多信息,请参见SQL PREPARE TRANSACTION

  • 手动调用VACUUM相关命令,支持清理任何表。

    说明

    Vacuum是用于回收已删除行所占用的磁盘空间,并更新统计信息的过程。更多信息,请参见VACUUM

    SQL示例

    • 执行VACUUM操作,清理当前数据库中的所有表。在执行VACUUM命令时,会使用默认的VACUUM配置参数。

      VACUUM;
    • 执行VACUUM FULL操作,对当前数据库中的所有表进行彻底的清理。VACUUM FULL操作会重新组织表的物理存储并释放未使用的磁盘空间。它可能需要更长的时间和更多的系统资源。

      VACUUM FULL;
    • 针对特定的表进行VACUUM操作。更精确地控制哪些表需要进行VACUUM,对不同的表使用不同的VACUUM配置参数。

      VACUUM FULL <table_name>;

      table_name指具体表名。

  • 使用CREATE EVENT TRIGGER创建事件触发器(Event trigger),或将事件触发器的所有者改为自己。

    说明

    事件触发器的更多信息,请参见CREATE EVENT TRIGGER

    SQL示例

    • 创建事件触发器

      示例场景:创建一个名为test_trigger的事件触发器,在DDL命令(CREATE、ALTER、DROP 等)完成时触发,调用名为test_function()的函数。

      CREATE EVENT TRIGGER test_trigger
      ON ddl_command_end
      EXECUTE FUNCTION test_function();
    • 修改事件触发器所有者。

      ALTER EVENT TRIGGER test_trigger OWNER TO new_owner;

      new_owner:修改后事件触发器的所有者。

  • 使用CREATE EXTENSION创建插件。支持的插件请参见支持插件列表

    SQL示例

    CREATE EXTENSION <插件名>;
  • 创建函数时为函数指定LEAKPROOF属性,或修改函数的LEAKPROOF的属性。

    说明

    更多信息,请参见CREATE FUNCTION

    SQL示例

    CREATE OR REPLACE FUNCTION test_function() 
    RETURNS void 
    LANGUAGE sql 
    LEAKPROOF 
    AS $$
    -- 函数的实现代码
    $$;
  • 使用CREATE PUBLICATION创建发布,或修改一个发布的所有者。

    说明

    在PostgreSQL中,创建发布(publication)是通过逻辑复制功能来实现的,允许将数据库的更改操作传输到其他数据库实例。

    SQL示例

    • 创建发布。仅为示例,详细使用方法,请参见CREATE PUBLICATION

      CREATE PUBLICATION test_publication FOR ALL TABLES;
    • 修改一个发布的所有者。

      ALTER PUBLICATION <publication_name> OWNER TO <new_owner>;
  • 使用CREATE SUBSCRIPTION创建订阅,或修改一个订阅的所有者。

    说明

    在PostgreSQL中,您可以通过逻辑复制功能创建订阅(subscription)。订阅允许将来自发布(publication)的更改应用到订阅数据库。

    SQL示例

    • 创建订阅。仅为示例,详细使用方法,请参见CREATE SUBSCRIPTION

      CREATE SUBSCRIPTION test_subscription
        CONNECTION 'host=<发布端连接地址> port=<发布端端口> dbname=<数据库> user=<账号> password=<密码>'
        PUBLICATION test_publication
        WITH (slot_name = <replication_slot_name>, create_slot = false);

      test_publication为发布端的发布名称。

    • 修改一个订阅的所有者。

      ALTER SUBSCRIPTION <subscription_name> OWNER TO <new_owner>;
  • 使用文本搜索(text search)功能,进行全文搜索和文本匹配操作。更多信息,请参见Full Text Search

  • 修改数据类型的所有者。

    SQL示例

    ALTER TYPE <type_name> OWNER TO <new_owner>;
  • 创建高权限账号,或者修改其他普通账号为高权限账号。

    SQL示例

    -- 创建账号
    CREATE USER <user_name> WITH PASSWORD '<账号密码>';
    -- 修改账号为高权限账号
    GRANT pg_rds_superuser TO <user_name>;
  • 查看高权限账号和所有普通账号的后端进程,并支持对进程使用pg_terminate_backend()等函数。

    SQL示例

    -- 查询某个账号下的所有后端进程
    SELECT pid, datname, usename, application_name
    FROM pg_stat_activity
    WHERE usename = '<高权限账号或普通账号>';
    
    -- 执行pg_terminate_backend()函数,终止进程
    SELECT pg_terminate_backend(pid);
  • 从视图pg_stat_activity中获取高权限账号和所有普通账号的后端连接信息。

    SQL示例

    SELECT *
    FROM pg_stat_activity
    WHERE usename = '<高权限账号或普通账号>';
  • 对普通账号的对象执行GRANTREVOKE操作。更多信息,请参见GRANTREVOKE

    SQL示例

    -- 使用GRANT命令授权,使普通账号能够执行DELETE语句来删除表中的行数据
    GRANT DELETE ON <table_name> TO <user_name>;
    
    -- 使用REVOKE命令撤销权限
    REVOKE DELETE ON <table_name> FROM <user_name>;
  • 使用SET ROLE将当前会话的账号(即高权限账号)权限变更为指定普通账号的权限。

    SQL示例

    SET ROLE <普通账号>;

相关参考

如果您需要对账号权限进行精细化管理,请参见RDS PostgreSQL权限管理最佳实践