关键字:
数据库;模式;public;权限; 、人大金仓、KingbaseES
概述
一个Kingbase数据库集群包含一个或多个已命名的数据库。用户和用户组在整个集群范围是共享的,但是拥有的数据并不共享。任何与服务器连接的客户端都只能访问在连接请求里声明的数据库。集群中的用户并不一定要有访问集群内所有数据库的权限。共享用户名是指不能有重名用户。若同一集群有两个数据库和一个joe用户,系统可配置为只允许joe访问其中一个数据库。一个数据库包含一个或多个已命名的模式,模式包含表及其它对象,如数据类型、函数、操作符等。相同对象名可以在不同模式定义和使用但不会冲突。与数据库不同,模式不是严格分离的,只要有权限,一个用户可以访问所连接的数据库中的任意模式中的对象。
模式的优点
1、允许多个用户使用一个数据库而不会干扰其它用户。
2、将数据库对象组织成逻辑组,使得它们更便于管理。
3、第三方的应用可以放在不同的模式中,但不会和其它同名对象冲突。
注:模式类似于操作系统层次的目录,但不能嵌套。
创建模式
1、模式创建语句:CREATE SCHEMA 模式名
要创建或者访问模式中的对象,写出一个受修饰的名字,该名字包含模式名及表名,它们之间用一个句点分开。
在模式中创建一个表:CREATE TABLE test_schema.test_table(id INT, name varchar(20));
INSERT INTO test_schema.test_table(id, name) VALUES(12, 'join'),(13, 'bob');
SELECT * FROM test_schema.test_table;
该方式在任何需要表的地方都可用,实际上,更一般的使用模式中表的语法是:
database.schema.table,如:SELECT * FROM test.test_schema.test_table;
2、若一个模式是空的(所有它里面的对象都已经被删除),删除命令为:DROP SCHEMA test_schema;
若一个模式不是空的(如模式里面有表),删除命令为:DROP SCHEMA test_schema CASCADE;
3、若想创建一个他人的模式,需要有创建的权限:
select usename from pg_user;
select current_user;
CREATE SCHEMA schema_name AUTHORIZATION sao;
在当前用户创建模式能成功:CREATE SCHEMA schema_name AUTHORIZATION kmxiao;
4、若没有声明任何模式名字创建了表,则缺省时,表及其对象会自动放到public模式中,每个数据库都包含这样的模式,以下命令是等价的:
CREATE TABLE test_table(id INT);和CREATE TABLE public.test_table_2(id INT);
可见,两种创建表的方式都属于public模式。
模式搜索路径
1、由于使用指定模式中的数据库对象时写出模式名.对象名的方式不方便,因此,表通常使用未修饰的名字引用,该名字只含有表名。系统通过查找一个搜索路径来判断一个表究竟是哪个表,该路径是一个需要查找的模式名列表。在搜索路径里找到的第一个表将被使用。若在搜索路径中没有找到表,将会报告一个错误(即便在数据库其它模式中存在此表)
2、显示当前模式:SHOW search_path;
设置模式的搜素路径后,就可以不使用模式修饰来访问表:
CREATE SCHEMA test_schema;
SET search_path TO kmxiao,test_schema;
当新对象缺省时,将会被默认创建在该模式下,若不明确进行修饰,就不能访问public模式,public模式没有任何特别之处,只是它缺省时就存在,当然也可以将其删除。搜索路径对于数据类型名、函数名、操作符名的运作方式和表名完全相同。数据类型和函数名可以像表名一样加以修饰。
模式和权限
用户也可以在别人的模式里创建对象,若要这样做,需要赋予在该模式上的CREATE权限。缺省时每个人都在public模式上有CREATE和USAGE权限,这样会允许所有可连接到指定数据库上的用户创建对象,当然也可以撤销该权限。
语法为:REVOKE CREATE ON SCHEMA public FROM PUBLIC;
创建用户test_user可在public模式下创建表:
可见,能够正常在public模式下创建表。
执行撤销权限:REVOKE CREATE ON SCHEMA public FROM PUBLIC;
创建表由于权限不够而被拒绝。
在kmxiao用户下创建的test_schema模式,用户test_user不能创建表:
在kmxiao用户下赋予test_user用户创建表的权限:
GRANT CREATE ON SCHEMA test_schema to test_user;
可见,此时用户test_user能够在模式test_schema创建表。
系统表模式
除了public和用户创建的模式外,每个数据库都包含一个sys_catalog模式,它包含了系统表和所有内置数据类型、函数、操作符。
切换到sys_catalog模式:SET search_path TO kmxiao, sys_catalog;
查看系统表:SELECT table_name FROM information_schema.tables WHERE table_schema = 'sys_catalog';
查看内置数据类型:SELECT typname FROM sys_type WHERE typtype = 'b';
查看内置函数:SELECT proname FROM sys_proc;
查看内置操作符:SELECT oprname FROM sys_operator;
参考资料
KingbaseES V8用户手册