模式管理
 
                  更新时间 2025-02-14 10:22:16
                 
 
                    最近更新时间: 2025-02-14 10:22:16
                  
 本文为您介绍天翼云TeleDB数据库模式管理相关操作。
 创建模式
- 标准语法 - teledb=# create schema teledb_schema; CREATE SCHEMA
- 扩展语法,不存在时才创建 - teledb=# create schema if not exists teledb_schema; NOTICE: schema "teledb_schema" already exists, skipping CREATE SCHEMA
- 指定所属用户 - teledb=# create schema teledb_schema_owner AUTHORIZATION teledb_user; CREATE SCHEMA teledb=# \dn teledb_schema_owner List of schemas Name | Owner ----------------------+-------------- teledb_schema_owner | teledb_user (1 row)
修改模式属性
- 修改模式名 - teledb=# alter schema teledb_schema rename to teledb_schema_new; ALTER SCHEMA
- 修改所有者 - teledb=# \dn teledb_schema_new List of schemas Name | Owner --------------------+--------- teledb_schema_new | teledb (1 row) teledb=# alter schema teledb_schema_new owner to teledb_user; ALTER SCHEMA teledb=# \dn teledb_schema_new List of schemas Name | Owner --------------------+-------------- teledb_schema_new | teledb_user (1 row)
- 删除模式 - teledb=# drop schema teledb_schema_owner; DROP SCHEMA- 当模式中存在对象时,则会删除失败,提示如下。 - teledb=# create table teledb_schema_new.test(id int); CREATE TABLE teledb=# drop schema teledb_schema_new; ERROR: cannot drop schema teledb_schema_new because other objects depend on it DETAIL: table teledb_schema_new.test depends on schema teledb_schema_new HINT: Use DROP ... CASCADE to drop the dependent objects too.- 参考如下强制删除,会将模式中的对象也级联删除掉。 - teledb=# drop schema teledb_schema_new cascade; NOTICE: drop cascades to table teledb_schema_new.test DROP SCHEMA
删除模式
普通用户对于某个模式下的对象访问除了访问对象要授权外,模式也需要授权。
[teledb@localhost bin]$ ./telesql -p 11111 -U teledb -d teledb
Password for user teledb: 
telesql (TeleDB V6)
Type "help" for help.
-- 创建shema
teledb=# create schema test;
CREATE SCHEMA
-- 创建表
teledb=# create table test.t1(id int);
CREATE TABLE
-- 创建用户user1
teledb=# create role user1 with login password 'User@184';
CREATE ROLE
-- 授权表访问权限给用户user1
teledb=# grant select on test.t1 to user1;
GRANT切换到普通用户user1,尝试访问test.t1表,由于没有授权test模式,仍然无法访问
teledb=# \c - user1
Password for user user1: 
You are now connected to database "teledb" as user "user1".
teledb=> select * from test.t1;
ERROR:  permission denied for schema test
LINE 1: select * from test.t1;
^切换到teledb用户,将test模式的访问权限授权给user1,重新用user1访问t1表
teledb=> \c - teledb
Password for user teledb: 
You are now connected to database "teledb" as user "teledb".
-- 授权schema
teledb=# grant usage on schema test to user1;
GRANT
teledb=# \c - user1
Password for user user1: 
You are now connected to database "teledb" as user "user1".
teledb=> select * from test.t1;
id 
----
(0 rows)配置用户访问模式权限
普通用户对于某个模式下的对象访问除了访问对象要授权外,模式也需要授权。
[teledb@localhost bin]$ ./telesql -p 11111 -U teledb -d teledb
Password for user teledb: 
telesql (TeleDB V6)
Type "help" for help.
-- 创建shema
teledb=# create schema test;
CREATE SCHEMA
-- 创建表
teledb=# create table test.t1(id int);
CREATE TABLE
-- 创建用户user1
teledb=# create role user1 with login password 'User@184';
CREATE ROLE
-- 授权表访问权限给用户user1
teledb=# grant select on test.t1 to user1;
GRANT切换到普通用户user1,尝试访问test.t1表,由于没有授权test模式,仍然无法访问
teledb=# \c - user1
Password for user user1: 
You are now connected to database "teledb" as user "user1".
teledb=> select * from test.t1;
ERROR:  permission denied for schema test
LINE 1: select * from test.t1;
^切换到teledb用户,将test模式的访问权限授权给user1,重新用user1访问t1表
teledb=> \c - teledb
Password for user teledb: 
You are now connected to database "teledb" as user "teledb".
-- 授权schema
teledb=# grant usage on schema test to user1;
GRANT
teledb=# \c - user1
Password for user user1: 
You are now connected to database "teledb" as user "user1".
teledb=> select * from test.t1;
id 
----
(0 rows)配置访问模式的顺序
TeleDB有一个运行变量叫search_path,其值为模式名列表,用于配置访问数据对象的顺序,如下所示。
当前连接用户。
teledb=# select current_user;
current_user 
--------------
teledb
(1 row)显示当前search_path,搜索路径只配置为$user, public,其中 $user为当前用户名,即上面的current_user 值teledb。
teledb=# show search_path;
search_path   
-----------------
"$user", public
(1 row)不指定模式创建数据表,则该表存放于第一个搜索模式下面。第一个模式找不到的情况下选择第二个,依次顺序查找。
teledb=# create table t2(id int, content text);
CREATE TABLE
teledb=# \dt t2
List of relations
Schema | Name | Type  |  Owner  
--------+------+-------+---------
public | t2   | table | teledb
(1 row)
--由于没有teledb模式,所以表默认放到了public模式下
-- 创建teledb模式后再次建表,表建到了teledb模式下
teledb=# create schema teledb;
CREATE SCHEMA
teledb=# create table t3(id int, content text);
CREATE TABLE
teledb=# \dt t3
List of relations
Schema  | Name | Type  |  Owner  
---------+------+-------+---------
teledb | t3   | table | teledb
(1 row)指定表位于某个模式下,不同模式下表名可以相同。在public模式下创建t3表
teledb=# create table public.t3(id int, content text);
CREATE TABLE
teledb=# \dt public.t3
List of relations
Schema | Name | Type  |  Owner  
--------+------+-------+---------
public | t3   | table | teledb
(1 row)同名的表查询时,没有指定shema时,始终只会查到前面模式的表数据。
-- 插入数据到public.t3表
teledb=# insert into public.t3 values(1,'test');
INSERT 0 1
-- 由于teledb模式在第一顺位,且存在同名表,所以始终是teledb模式下的空表
teledb=# select * from t3;
id | content 
----+---------
(0 rows)
-- 指定public模式去查询可以查到插入的数据
teledb=# select * from public.t3;
id | content 
----+---------
1 | test
(1 row)访问不在搜索路径的对象时,需要写全路径。
teledb=# create table test1.t4 (id int, name char);
CREATE TABLE
teledb=# select * from t4;
ERROR:  relation "t4" does not exist
LINE 1: select * from t4;
^
teledb=# select * from test1.t4;
id | name 
----+------
(0 rows)上面出错是因为模式test1没有配置在search_path搜索路径中。
