暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kingbase模式及模式权限及常用操作

原创 tyxiaoleng 2023-12-20
5094

模式(schema)

模式是对数据库的逻辑分割,是一个命名空间,在不同的模式下可以有相同名称的表、函数等。一个数据库包含一个或者多个模式,模式中又包含表、函数等数据库对象。

  1. 数据库对象的集合
  2. 一个数据库包含一个或多个模式
  3. 不同模式下可存在同名对象
  4. 创建模式需要用户对数据库有C权限

特殊模式(public)说明

未收回数据库public角色对public模式权限时,新建用户默认继承public角色权限,在任何数据库的public 模式下有usage和create的权限。

即:新建用户在未收回数据库public角色对public模式权限时,默认使用public模式,在该数据库拥有public模式对象的所有权限。

模式对象

数据库模式是数据库所有对象的集合,称为模式对象,KingbaseES SQL提供许多类型的模式对象,如下:

模式对象 描述
表按行存储数据。表是关系数据库中最重要的模式对象。
索引 索引提供指向存储在表的指定列中数据值的指针,实现对行进行直接、快速访问。KingbaseES数据库支持几种类型的索引。
分区 分区是大表和索引的一部分。每个分区都有自己的名称,并且可以选择拥有自己的存储特性。
视图 视图是对一个或多个表或其他视图中数据查询。可以将它们视为存储查询。视图实际上不包含数据。
序列 序列自动生成有序的整数值,可以由多个用户共享使用。通常,使用序列来生成主键值
同义词 同义词是另一个模式对象的别名对象。因为同义词只是一个别名,所以它不需要存储。除了在数据字典中的定义外,它不需要存储。
PL/SQL程序和包 PL/SQL是SQL的过程扩展。PL/SQL子程序是一个命名PL/SQL的块,可以用一组参数调用。PL/SQL包对逻辑相关的PL/SQL类型、变量和子程序进行分组。

模式对象访问

  1. 用户需要对模式有USAGE权限
  2. 对目标模式对象有select权限
  3. 不带模式名时沿search_path模式列表顺序查找,带模式名时忽略search_path
  4. 修改search_path需要数据库属主用户或超级用户
  5. sys_catalog模式总是被搜索,与search_path无关
  6. 模式重命名后,模式对象随模式名变更所属模式

模式权限

模式权限说明

通过ksql元命令\dn+ [schema_name]查询
权限 说明 标志
ALL UC权限
USAGE 允许访问模式中的对象,允许使用currval和naxtval函数,允许创建表、函数和其他模式对象时使用该模式下的类型或域 U
CREATE 允许创建模式对象 C

常用操作

-- 模式创建 create schema <schema_name>; -- 新建模式指定用户 CREATE SCHEMA <schema_name> AUTHORIZATION <user_name>; -- 创建一个用户同名模式(注意:已存在用户) CREATE SCHEMA AUTHORIZATION <user_name>; -- 检查模式定义 \dn+ <schema_name> -- 修改模式属主 ALTER SCHEMA <schema_name> OWNER TO <user_name>; -- 修改模式名 ALTER SCHEMA <old_schema_name> RENAME TO <new_schema_name>; -- 模式下创建表 CREATE TABLE <schema_name>.<table_name(col_name col_type,.....)>; -- 查看模式对象信息 \d+ <schema_name>.* -- 查看对象默认查找模式(顺序查找) SHOW search_path; -- 查看$USER \echo :USER -- 修改search_path alter database <db_name> set search_path to "$user",<schema_name_list>,sys_catalog, pg_catalog; select sys_reload_conf(); -- 重新加载配置 -- 模式授权 grant USAGE|ALL|CREATE ON SCHEMA <schema_name> to <user_name>; grant USAGE|ALL|CREATE ON SCHEMA <schema_name> to PUBLIC; -- 回收权限 revoke USAGE|ALL|CREATE on SCHEMA <schema_name> from <user_name>; revoke USAGE|ALL|CREATE on SCHEMA <schema_name> from PUBLIC; -- 删除模式 drop schema <schema_name> [cascade]; -- cascade为级联删除模式对象

试验测试

test=# \du+ 角色列表 角色名称 | 属性 | 成员属于 | 描述 ----------+--------------------------------------------+----------+------ dbadmin | 超级用户 | {} | dbopra | 建立 DB | {} | kcluster | 无法登录 | {} | sao | 没有继承 | {} | sso | 没有继承 | {} | ssoadmin | | {} | system | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {} | testuser | | {} | utyxl | 2个连接 +| {} | | 密码有效直至2023-12-31 00:00:00+08 | | utyxl01 | | {} | utyxl02 | | {} | -- 创建schtyxl用户同名模式 test=# CREATE SCHEMA AUTHORIZATION schtyxl; -- schtyxl用户不存在,创建模式失败 错误: 角色 "schtyxl" 不存在 db02=> \l db02 数据库列表 名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 ------+--------+----------+-------------+-------------+----------------- db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | dbopra=c/dbopra+ | | | | | utyxl=c/dbopra (1 行记录) -- 测试数据库无C权限时模式创建 db02=> \c db02 utyxl; You are now connected to database "db02" as userName "utyxl". db02=> CREATE SCHEMA AUTHORIZATION utyxl; -- utyxl用户在db02上无C权限 错误: 对数据库 db02 权限不够 -- 赋权数据库C权限,创建utyxl用户同名模式 db02=> \c db02 dbopra; You are now connected to database "db02" as userName "dbopra". db02=> grant CREATE on DATABASE db02 to utyxl; -- 授权C GRANT db02=> \l+ db02 数据库列表 名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述 ------+--------+----------+-------------+-------------+-----------------+-------+-------------+------ db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | dbopra=c/dbopra+| 14 MB | sys_default | | | | | | utyxl=Cc/dbopra | | | (1 行记录) db02=> \c db02 utyxl; You are now connected to database "db02" as userName "utyxl". db02=> CREATE SCHEMA AUTHORIZATION utyxl; -- 创建utyxl用户同名模式 CREATE SCHEMA db02=> \dn+ utyxl 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 -------+--------+----------+------ utyxl | utyxl | | (1 行记录) -- 查看模式查询路径 db02=> show search_path; -- 查看search_path search_path ----------------- "$user", public (1 行记录) db02=> \echo :USER -- 查看$USER utyxl -- 创建表 db02=> create table flg(id int); CREATE TABLE db02=> \d 关联列表 架构模式 | 名称 | 类型 | 拥有者 ----------+-------------------------+--------+-------- public | sys_stat_statements | 视图 | system public | sys_stat_statements_all | 视图 | system utyxl | flg | 数据表 | utyxl -- 默认创建对象到同名模式下 db02=> \c - dbadmin You are now connected to database "db02" as userName "dbadmin". db02=# revoke USAGE on SCHEMA public from PUBLIC ; -- 回收对public模式的访问权限 REVOKE db02=> \d -- 看不到public模式对象 关联列表 架构模式 | 名称 | 类型 | 拥有者 ----------+------+--------+-------- utyxl | flg | 数据表 | utyxl (1 行记录) -- 修改模式名 db02=> alter schema utyxl rename to new_utyxl; ALTER SCHEMA db02=> \dn+ new_utyxl 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 -----------+--------+----------+------ new_utyxl | utyxl | | (1 行记录) db02=> show search_path; search_path ----------------- "$user", public (1 行记录) -- 查询默认对象 db02=> \dt Did not find any relations. -- 无对象 -- 指定模式名查询对象 db02=> \dt new_utyxl.* 关联列表 架构模式 | 名称 | 类型 | 拥有者 -----------+------+--------+-------- new_utyxl | flg | 数据表 | utyxl (1 行记录) -- 修改search_path,查询默认对象 db02=> alter database db02 set search_path to "$user",new_utyxl,public; ALTER DATABASE db02=> \c - utyxl You are now connected to database "db02" as userName "utyxl". db02=> show search_path ; search_path ---------------------------- "$user", new_utyxl, public (1 行记录) db02=> \d 关联列表 架构模式 | 名称 | 类型 | 拥有者 -----------+------+--------+-------- new_utyxl | flg | 数据表 | utyxl (1 行记录) -- 回收utyxl用户在new_utyxl上的U权限,查询对象 db02=> revoke USAGE on SCHEMA new_utyxl from utyxl; REVOKE db02=> \d -- utyxl用户在new_utyxl上无U权限,不能查询new_utyxl模式对象 Did not find any relations. -- 删除new_utyxl模式 db02=> drop schema new_utyxl ; 错误: 无法删除 模式 new_utyxl 因为有其它对象倚赖它 描述: 表 new_utyxl.flg 倚赖于 模式 new_utyxl 提示: 使用 DROP .. CASCADE 把倚赖对象一并删除. db02=> drop schema new_utyxl cascade; -- 递归强制删除new_utyxl模式 注意: 递归删除 表 new_utyxl.flg DROP SCHEMA db02=> \dn+ new_utyxl 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 ------+--------+----------+------ (0 行记录)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论