PostgreSQL学习手册(模式Schema)

来源:互联网 发布:模拟退火 遗传算法结合 编辑:程序博客网 时间:2024/05/22 00:25
一个数据库包含一个或多个命名的模式,模式又包含表。模式还包含其它命名的对象,包括数据类型、函数,以及操作符。同一个对象名可以在不同的模式里使用而不会导致冲突; 比如,schema1和myschema都可以包含叫做mytable的表。和数据库不同,模式不是严格分离的:一个用户可以访问他所连接的数据库中的任意模式中的对象,只要他有权限。
    我们需要模式有以下几个主要原因:
    1). 允许多个用户使用一个数据库而不会干扰其它用户。
    2). 把数据库对象组织成逻辑组,让它们更便于管理。
    3). 第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。
    
    1. 创建模式:
    CREATE SCHEMA myschema;
    通过以上命令可以创建名字为myschema的模式,在该模式被创建后,其便可拥有自己的一组逻辑对象,如表、视图和函数等。
    
    2. public模式:
    在介绍后面的内容之前,这里我们需要先解释一下public模式。每当我们创建一个新的数据库时,PostgreSQL都会为我们自动创建该模式。当登录到该数据库时,如果没有特殊的指定,我们将以该模式(public)的形式操作各种数据对象,如:
    CREATE TABLE products ( ... ) 等同于 CREATE TABLE public.products ( ... )
    
    3. 权限:
    缺省时,用户看不到模式中不属于他们所有的对象。为了让他们看得见,模式的所有者需要在模式上赋予USAGE权限。为了让用户使用模式中的对象,我们可能需要赋予额外的权限,只要是适合该对象的。PostgreSQL根据不同的对象提供了不同的权限类型,如:
    GRANT ALL ON SCHEMA myschema TO public; 
    上面的ALL关键字将包含CREATEUSAGE两种权限。如果public模式拥有了myschema模式的CREATE权限,那么登录到该模式的用户将可以在myschema模式中创建任意对象,如:
    CREATE TABLE myschema.products (
        product_no integer,
        name text,
        price numeric CHECK (price > 0),
    );
    在为模式下的所有表赋予权限时,需要将权限拆分为各种不同的表操作,如:
    ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO public;
    在为模式下的所有Sequence序列对象赋予权限时,需要将权限拆分为各种不同的Sequence操作,如:
    ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT SELECT, UPDATE, USAGE ON SEQUENCES TO public;
    在为模式下的所有函数赋予权限时,仅考虑执行权限,如:
    ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT EXECUTE ON FUNCTIONS TO public;
    可以看出,通过以上方式在public模式下为myschema模式创建各种对象是极为不方便的。下面我们将要介绍另外一种方式,即通过role对象,直接登录并关联到myschema对象,之后便可以在myschema模式下直接创建各种所需的对象了。
    CREATE ROLE myschema LOGIN PASSWORD '123456'; --创建了和该模式关联的角色对象。
    CREATE SCHEMA myschema AUTHORIZATION myschema; --将该模式关联到指定的角色,模式名和角色名可以不相等。
    在Linux Shell下,以myschema的角色登录到数据库MyTest,在密码输入正确后将成功登录到该数据库。
    /> psql -d MyTest -U myschema
    Password:
    MyTest=> CREATE TABLE test(i integer);
    CREATE TABLE
    MyTest=> \d   --查看该模式下,以及该模式有权限看到的tables信息列表。
              List of relations
     Schema     |   Name   | Type  |  Owner
    ------------+---------+------+----------
     myschema |   test     | table  | myschema
    (1 rows)
    
    4. 删除模式:
    DROP SCHEMA myschema;
    如果要删除模式及其所有对象,请使用级联删除:
    DROP SCHEMA myschema CASCADE;
    
    5. 模式搜索路径:
    我们在使用一个数据库对象时可以使用它的全称来定位对象,然而这样做往往也是非常繁琐的,每次都不得不键入owner_name.object_name。PostgreSQL中提供了模式搜索路径,这有些类似于Linux中的$PATH环境变量,当我们执行一个Shell命令时,只有该命令位于$PATH的目录列表中,我们才可以通过命令名直接执行,否则就需要输入它的全路径名。PostgreSQL同样也通过查找一个搜索路径来判断一个表究竟是哪个表,这个路径是一个需要查找的模式列表。在搜索路径里找到的第一个表将被当作选定的表。如果在搜索路径中 没有匹配表,那么就报告一个错误,即使匹配表的名字在数据库其它的模式中存在也如此。
    在搜索路径中的第一个模式叫做当前模式。除了是搜索的第一个模式之外,它还是在CREATE TABLE没有声明模式名的时候,新建表所属于的模式。要显示当前搜索路径,使用下面的命令:
    MyTest=> SHOW search_path;
      search_path
    ----------------
     "$user",public
    (1 row)
    可以将新模式加入到搜索路径中,如:
    SET search_path TO myschema,public;
    为搜索路径设置指定的模式,如:

    SET search_path TO myschema; --当前搜索路径中将只是包含myschema一种模式。

    转载: http://www.cnblogs.com/stephen-liu74/archive/2012/04/25/2291526.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初三了英语很差怎么办 数学考30分怎么办 小学生阅读理解能力差怎么办 小学一年级数学差怎么办 小学一年级数学很差怎么办 初中生脸上长斑怎么办 初中生脸上长痘怎么办 初中成绩不好高中怎么办 农村老人去城里怎么办 留守儿童想妈妈怎么办 教师档案丢失了怎么办 转正定级表丢失怎么办 娃娃写作业慢怎么办 写作业眼睛疼怎么办 发生火灾怎么办大班教案 大班健康发生火灾怎么办 学生上课不提问怎么办 入户通知单丢了怎么办 打架后还来找事该怎么办 着火了怎么办教案视频 电脑一小半黑屏怎么办 绝地求生闪退怎么办 win7没浏览器了怎么办 浏览器被删除了怎么办 把快捷方式删了怎么办 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办 教官12123一直加载怎么办 教官嗓子哑了怎么办 喜欢上考场教官怎么办