GaussDB 中 alter default privileges 的使用示例(下)

在 《GaussDB中 alter default privileges 的使用示例(上)》 中,对alter default privileges的作用及语法做了介绍,本文,将继续通过使用示例来做进一步的说明。

第三章 使用示例

3.1 示例1:使用初始用户授权,不指定SCHEMA

使用数据库初始用户(默认是gaussdb)操作,允许user2用户,访问user1用户中已经存在的表(包含视图),以及未来创建的表(包含视图)。

1、 清理环境,避免影响

图片.png

2、 创建user1,user2,并允许user2访问user1中此后创建的表和视图。

图片.png

3、 在user1中创建表及视图

图片.png

4、 使用user2登录数据库,并访问user1中创建的表及视图

图片.png

如上所示,用户user2已可以访问授权以后,user1创建的表及视图。

3.2 示例2:使用当前用户授权

在示例1中,我们使用的是数据库的初始用户,来指定将user1中未来创建的表(包含视图)允许user2来访问。所以,在命令中,我们需要使用“for user user1”的选项来指定user1。若我们使用user1用户自身来授权user2时,则该选项可以省略。

测试过程如下:

1、 清理环境,避免影响

图片.png

2、 创建user1,user2,并允许user2访问user1中此后创建的表和视图。

图片.png

使用user1登录后,执行alter default privileges 命令:

图片.png

注意,上图与示例1的区别在于:其一,执行的用户是user1,其二,命令中无需指定“for user user1”选项。当不指定该选项时,默认是当前用户。

3、 在user1中创建表及视图

图片.png

4、 使用user2登录数据库,并访问user1中创建的表及视图

图片.png

如上所示,用户user2已可以访问授权以后,user1创建的表及视图。

3.3 示例3:指定SCHEMA

在前面的示例1和示例2,是将user1下的表(包括视图),无论其处于哪个SCHEMA下,都允许user2来访问。如果只允许user2访问user1指定SCHEMA(可以指定多个)下的表(包括视图),则需要使用到“[ IN SCHEMA schema_name [, …] ]”选项。
以下,将展示此场景需求下的操作及效果:

1、 清理环境,避免影响

图片.png

2、 创建user1,user2及所需的schema

为user1额外再创建两个schema(user_schema1和user_schema2),设置其owner为user1,并允授权user2对user1所拥有的三个schema(user1,user_schema1,user_schema2)的usage权限
图片.png

3、 使用alter default privileges命令,允许user2访问

user_schema1和user_schema2中未来创建的表(包括视图)
图片.png

如上图所示,我们这里使用到了“in schema user_schema1,user_schema2”的选项。

4、 使用user1创建相应的表和视图

使用user1,分别在上述的三个schema中,各创建一张表。在三个schema中,还各创建三个视图,这三个视图用于分别访问不同schema中的表。目的是测试user2可以访问哪些schema中的表和视图。
图片.png

如上图所示,在三个schema中,分别创建了三张表。

然后在三个schema中,各创建三个视图,用于分别访问上述三张表。如下图所示:
图片.png

如上图所示,虽然三个视图名称完全相同,但由于它们分别位于不同的schema中,所以,并不会产生类似“对象已存在”的冲突。

5、 使用user2访问上述的三张表

图片.png

如上所示,由于我们在使用alter default privileges给user2授权时,使用了“in schema user_schema1,user_schema2”的选项,所以,user2只能访问位于这两个schema中的表。

6、 使用user2访问前面创建的九个视图。

先来访问位于user1 schema中的三个视图:
图片.png

如上图所示,user2均无法访问。这是因为user2并无访问schema user1中的权限。
接下来,访问 user_schema1中的三个视图:
图片.png

如上图所示,我们发现,尽管我们并没有访问位于user1 schema中表user1_tab1的权限,但并不影响我们对位于user_schema1中访问该表的视图vw_user1_tab1的访问。

最后,我们访问 user_schema2中的三个视图:
图片.png

如上图所示,其结果与前述类似,这里不再赘述。

第四章 附录

ALTER DEFAULT PRIVILEGES语法摘要说明
语法格式:

  ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke;

其中abbreviated_grant_or_revoke子句用于指定对哪些对象进行授权或回收权限。有如下一些子句:

• grant_on_tables_clause
• grant_on_sequences_clause
• grant_on_functions_clause
• grant_on_types_clause
• grant_on_client_master_keys_clause
• grant_on_column_encryption_keys_clause
• revoke_on_tables_clause
• revoke_on_sequences_clause
• revoke_on_functions_clause
• revoke_on_types_clause
• revoke_on_client_master_keys_clause
• revoke_on_column_encryption_keys_clause

其中grant_on_tables_clause子句用于对表授权。

 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } 
  [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_sequences_clause子句用于对序列授权。

GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT }
[, …] | ALL [ PRIVILEGES ] }
ON SEQUENCES
TO { [ GROUP ] role_name | PUBLIC } [, …]
[ WITH GRANT OPTION ]

其中grant_on_functions_clause子句用于对函数授权。

  GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FUNCTIONS 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_types_clause子句用于对类型授权。

  GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPES 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_client_master_keys_clause子句用于对客户端主密钥授权。

  GRANT { { USAGE  | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEYS
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_column_encryption_keys_clause子句用于对列加密密钥授权。

 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEYS 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中revoke_on_tables_clause子句用于回收表对象的权限。

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } 
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_sequences_clause子句用于回收序列的权限。

REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT }
[, …] | ALL [ PRIVILEGES ] }
ON SEQUENCES
FROM { [ GROUP ] role_name | PUBLIC } [, …]
[ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_functions_clause子句用于回收函数的权限。

REVOKE [ GRANT OPTION FOR ]
    { {EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FUNCTIONS 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_types_clause子句用于回收类型的权限。

  REVOKE [ GRANT OPTION FOR ]
    { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPES 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_client_master_keys_clause子句用于回收客户端主密钥的权限。

  REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEYS 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_column_encryption_keys_clause子句用于回收列加密密钥的权限。

  REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEYS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

参数说明

target_role
已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。
取值范围:已有角色的名称。

schema_name
现有模式的名称。
target_role必须有schema_name的CREATE权限。
取值范围:现有模式的名称。

role_name
被授予或者取消权限角色的名称。
取值范围:已存在的角色名称。

如果想删除一个被赋予了默认权限的角色,有必要恢复改变的缺省权限或者使用DROP OWNED BY来为角色脱离缺省的权限记录。

<think> 我们正在讨论的是数据库中的ALTER SCHEMA命令。根据引用内容,特别是引用[2]提到了ALTER VIEW ... SET SCHEMA,但用户明确询问的是ALTER SCHEMA命令。然而,需要注意的是,在MySQL中,并没有直接的ALTER SCHEMA命令,通常我们使用ALTER DATABASE来修改数据库(因为MySQL中schema和database是同义词)。而在PostgreSQL/openGauss中,ALTER SCHEMA命令用于修改模式。 用户的问题:“我想了解alter schema命令的使用方法”。由于引用中提到了openGauss(引用[2])和MySQL(引用[1]和引用[3]),我们需要区分不同的数据库系统。 由于没有明确的数据库系统,我将分别介绍两种常见数据库系统(MySQL和PostgreSQL/openGauss)中ALTER SCHEMA(或其等效命令)的使用方法。 注意:在MySQL中,通常使用ALTER DATABASE,因为MySQL中的schema和database是等同的。而在PostgreSQL/openGauss中,ALTER SCHEMA命令是存在的。 因此,我将分为两部分: 1. 在MySQL中修改数据库(相当于修改schema)的方法 2. 在PostgreSQL/openGauss中修改schema的方法 同时,由于用户提到了“alter schema命令”,所以第二部分将是重点。 我们开始: 一、MySQL中的ALTER SCHEMA(实际上使用ALTER DATABASE) 在MySQL中,没有ALTER SCHEMA命令,而是使用ALTER DATABASE。因为MySQL中,数据库database)和模式(schema)是同义词。 语法: ```sql ALTER DATABASE [db_name] [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name ``` 示例: 1. 修改数据库的字符集为utf8mb4: ```sql ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 二、PostgreSQL/openGauss中的ALTER SCHEMA 在PostgreSQL和openGauss中,ALTER SCHEMA命令用于修改模式的定义。 主要用途: - 重命名模式 - 更改模式的所有者 注意:不能直接修改模式的字符集等属性,因为模式的字符集继承自数据库。 语法(根据引用[2]和PostgreSQL官方文档): 1. 重命名模式: ```sql ALTER SCHEMA name RENAME TO new_name; ``` 2. 更改模式的所有者: ```sql ALTER SCHEMA name OWNER TO new_owner; ``` 示例(openGauss/PostgreSQL): 1. 将模式myschema重命名为newschema: ```sql ALTER SCHEMA myschema RENAME TO newschema; ``` 2. 将模式myschema的所有者改为newowner: ```sql ALTER SCHEMA myschema OWNER TO newowner; ``` 此外,在引用[2]中还提到了一种用法:将视图移动到另一个模式(ALTER VIEW ... SET SCHEMA),虽然不属于ALTER SCHEMA命令本身,但也是修改模式内容的一部分。 三、注意事项 - 在MySQL中,修改数据库(模式)的字符集只会影响新创建的表,已有表不会改变,除非使用ALTER TABLE单独修改。 - 在PostgreSQL/openGauss中,修改模式的所有者需要新所有者用户已经存在,并且执行该命令的用户必须是当前模式的所有者或超级用户。 四、最佳实践 1. 在执行ALTER SCHEMA(或ALTER DATABASE)操作前,确保备份数据库。 2. 在重命名模式时,请注意更新所有引用该模式的应用程序连接字符串或查询语句。 3. 在修改模式所有者时,确保新所有者具有适当的权限。 由于用户问题可能针对不同数据库,建议用户明确使用数据库系统。 最后,生成相关问题: </think> 以下是关于 `ALTER SCHEMA` 命令的详细使用指南,结合了数据库系统的最佳实践和特性: ### 一、`ALTER SCHEMA` 核心功能 用于修改数据库模式的元数据,主要包括: 1. **重命名模式** ```sql -- PostgreSQL/openGauss语法 ALTER SCHEMA old_schema_name RENAME TO new_schema_name; -- SQL Server语法 ALTER SCHEMA new_schema_name TRANSFER old_schema_name.object_name; ``` 2. **修改所有者** ```sql -- PostgreSQL/openGauss语法 ALTER SCHEMA schema_name OWNER TO new_owner; -- MySQL等效操作(需权限调整) RENAME USER old_owner@localhost TO new_owner@localhost; ``` 3. **设置默认权限**(PostgreSQL特有) ```sql ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT ON TABLES TO readonly_role; ``` --- ### 二、跨数据库系统实现对比 | **操作** | PostgreSQL/openGauss | MySQL | SQL Server | |------------------|---------------------------|------------------------------|------------------------------| | **重命名模式** | `ALTER SCHEMA RENAME TO` | 无直接支持,需导出/导入数据 | `ALTER SCHEMA TRANSFER` | | **修改所有者** | `ALTER SCHEMA OWNER TO` | 修改用户权限 | 通过安全主体操作 | | **字符集/排序规则** | 不支持 | `ALTER DATABASE CHARACTER SET` | 重建模式时指定 | > 注:MySQL 中模式(Schema)数据库(Database)等同[^3],需用 `ALTER DATABASE` --- ### 三、关键注意事项 1. **锁机制风险** 重命名操作可能触发 **排他锁**,导致业务中断(尤其在 PostgreSQL 中)[^1] ```sql -- 建议在低峰期操作并设置超时 SET lock_timeout = '5s'; ALTER SCHEMA sales RENAME TO ecommerce; ``` 2. **依赖对象处理** 修改模式后需更新依赖对象: ```sql -- 更新视图依赖(openGauss示例ALTER VIEW IF EXISTS old_schema.view_name SET SCHEMA new_schema; [^2] ``` 3. **权限继承** 新所有者自动获得模式内对象的控制权,原所有者权限将被撤销 --- ### 四、最佳实践 1. **操作前检查依赖** ```sql -- PostgreSQL SELECT * FROM pg_depend WHERE refobjid = (SELECT oid FROM pg_namespace WHERE nspname='schema_name'); -- MySQL SHOW GRANTS FOR current_owner@localhost; ``` 2. **原子操作流程** ```mermaid graph TB A[开始] --> B[备份元数据] B --> C[设置维护窗口] C --> D[执行ALTER SCHEMA] D --> E[验证对象关联性] E --> F[更新应用连接串] F --> G[完成] ``` 3. **跨模式迁移工具** ```bash # 使用pg_dump/pg_restore迁移 pg_dump -n old_schema dbname > dump.sql sed -i 's/old_schema/new_schema/g' dump.sql psql dbname < dump.sql ``` --- ### 五、典型应用场景 **案例**:合并两个销售模式的报表视图 ```sql -- 1. 创建聚合模式 CREATE SCHEMA consolidated_reports; -- 2. 迁移视图(openGauss语法) ALTER VIEW retail_sales.v_monthly SET SCHEMA consolidated_reports; [^2] ALTER VIEW wholesale_sales.v_quarterly SET SCHEMA consolidated_reports; -- 3. 授权新角色 ALTER SCHEMA consolidated_reports OWNER TO bi_analyst; ``` > **避坑指南**:生产环境操作前务必验证 SQL 在测试库的执行计划,避免锁表导致的业务中断[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值