权限说明
重要 为了保障数据库的安全和稳定性,RDS PostgreSQL中的数据库账号未被授予对pg_authid表的访问权限。您可以通过使用pg_roles视图来查询数据库角色的信息。
普通账号
RDS PostgreSQL的普通账号权限和社区的非superuser账号的权限相同。具体请参见PostgreSQL官方文档。
高权限账号
RDS PostgreSQL的高权限账号除了支持普通账号的所有权限外,还支持以下权限:
手动调用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),或将事件触发器的所有者改为自己。
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创建插件。支持的插件请参见支持插件列表。
创建函数时为函数指定LEAKPROOF属性,或修改函数的LEAKPROOF的属性。
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>;
修改数据类型的所有者。
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 = '<高权限账号或普通账号>';
对普通账号的对象执行GRANT 、REVOKE操作。更多信息,请参见GRANT、REVOKE。
SQL示例
-- 使用GRANT命令授权,使普通账号能够执行DELETE语句来删除表中的行数据
GRANT DELETE ON <table_name> TO <user_name>;
-- 使用REVOKE命令撤销权限
REVOKE DELETE ON <table_name> FROM <user_name>;
使用SET ROLE将当前会话的账号(即高权限账号)权限变更为指定普通账号的权限。