PostgreSQL 模式操作

一个PostgreSQL数据库集群包含一个或多个已命名数据库。用户和用户组在整个集群范围内是共享的,但是其它数据并不共享。任何与服务器连接的客户都只能访问那个在连接请求里声明的数据库。

注意: 集群中的用户并不一定要有访问集群内所有数据库的权限。共享用户名的意思是不能有重名用户。假定同一个集群里有两个数据库和一个joe用户,系统可以配置成只允许joe 访问其中的一个数据库。

一个数据库包含一个或多个已命名的模式,模式又包含表。模式还可以包含其它对象,包括数据类型、函数、操作符等。同一个对象名可以在不同的模式里使用而不会导致冲突;比如,schema1myschema都可以包含一个名为mytable的表。和数据库不同,模式不是严格分离的:只要有权限,一个用户可以访问他所连接的数据库中的任意模式中的对象。

我们需要模式的原因有好多:

  • 允许多个用户使用一个数据库而不会干扰其它用户。
  • 把数据库对象组织成逻辑组,让它们更便于管理。
  • 第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。

模式类似于操作系统层次的目录,只不过模式不能嵌套。

创建模式

CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION user_name ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION user_name

例子

创建一个模式:

CREATE SCHEMA myschema;

为用户joe创建模式,模式名也叫joe

CREATE SCHEMA AUTHORIZATION joe;

创建一个名为test的模式,该模式被用户joe所拥有, 除非已经有一个名为test的模式。 (这与joe是否拥有早已存在的模式无关。)

CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;

创建一个模式并且在里面创建一个表:

CREATE SCHEMA hollywood
    CREATE TABLE films (title text, release date, awards text[])
    CREATE VIEW winners AS
        SELECT title, release FROM films WHERE awards IS NOT NULL;

请注意上面独立的子命令不是由分号结尾的

下面的命令是实现同样结果的等效语句:

CREATE SCHEMA hollywood;
CREATE TABLE hollywood.films (title text, release date, awards text[]);
CREATE VIEW hollywood.winners AS
    SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;

public模式

当创建一个新的数据库时,PostgreSQL都会自动创建该模式。当登录到该数据库时,如果没有特殊的指定,将以该模式(public)的形式操作各种数据对象,如:

CREATE TABLE products ( ... ) 等同于 CREATE TABLE public.products ( ... )

兼容性

SQL 标准允许在CREATE SCHEMA里面有一个 DEFAULT CHARACTER SET子句以及比目前PostgreSQL 可以接受的更多的子命令。

SQL 标准声明在CREATE SCHEMA里的子命令可以以任意顺序出现。 目前PostgreSQL里的实现还不能处理所有子命令里前向引用的情况; 有时候可能需要重排一下子命令的顺序以避免前向引用。

在 SQL 标准里,模式的所有者总是拥有其中的所有对象。 PostgreSQL允许模式包含非模式所有者拥有的对象。 只有在模式所有者将自己模式的CREATE权限给了其他人, 或者超级用户选择在该模式中创建对象时,才可能出现。IF NOT EXISTS选项是一个PostgreSQL扩展。

修改模式

ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO new_owner

ALTER SCHEMA修改一个模式的定义。

要使用ALTER SCHEMA,你必须是该模式的所有者。 要给一个模式重命名,你必须在该数据库上有CREATE权限。 要修改所有者,你还必须是新的所有角色的直接或间接成员, 并且该成员必须在此数据库上有CREATE权限。 (超级用户自动拥有全部权限。)

参数

  • name

现有模式的名字。

  • new_name

模式的新名字,新名字不能以pg_开头,因为这些名字是保留给系统模式的。

  • new_owner

模式的新所有者。

兼容性

SQL标准里没有ALTER SCHEMA语句。

删除模式

DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

DROP SCHEMA从数据库中删除模式。

模式只能被它的所有者或者超级用户删除。请注意, 所有者即使没有拥有模式中任何对象也可以删除模式(以及模式中的所有对象)。

参数

  • IF EXISTS

如果指定的模式不存在,那么发出一个 notice 而不是抛出一个错误。

  • *name*

模式的名字。

  • CASCADE

自动删除包含在模式中的对象(表、函数等等)。

  • RESTRICT

如果模式包含任何对象,则拒绝删除它。这个是缺省。

例子

从数据库中删除模式mystuff以及它包含的所有东西:

DROP SCHEMA mystuff CASCADE;

模式权限

缺省时,用户看不到模式中不属于他们所有的对象。为了让他们看得见,模式的所有者需要在模式上赋予USAGE权限。为了让用户使用模式中的对象,我们可能需要赋予额外的权限,只要是适合该对象的。PostgreSQL根据不同的对象提供了不同的权限类型,如:

GRANT ALL ON SCHEMA myschema TO public; 

上面的ALL关键字将包含CREATE和USAGE两种权限。如果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;

在为模式下的所有函数赋予权限时,仅考虑执行权限,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT EXECUTE ON FUNCTIONS TO public;

撤销模式权限可以这么做

REVOKE [CREATE...] ON SCHEMA public FROM 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)

模式搜索路径

在使用一个数据库对象时可以使用它的全称来定位对象,然而这样做往往也是非常繁琐的,每次都不得不键入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一种模式。

原文地址:https://www.cnblogs.com/oneTOinf/p/8458166.html

时间: 2024-10-18 12:19:44

PostgreSQL 模式操作的相关文章

CI 2.2.0可以使用AR模式操作Oracle 10g数据库

一.控制器 <?php if (!defined('BASEPATH'))    exit('No direct script access allowed'); class Topics extends CI_Controller{ function __construct()    {        parent::__construct();        $this->load->helper('url');        $this->load->helper('f

几个PostgreSQL数据库操作总结

创建表 语法:如下 create table     table_name     (column_name         column_type(parametes)options,…); 注意: ⑴     SQL语句对大小写不敏感 ⑵     通常忽略空白—应该使用空白使SQL命令具有更好的可读性. ⑶     表名和字段不能和SQL的保留字相同 一下示例师范如何创建表cd_collection: create      table         cd_collection ( id 

WSFC 维护模式操作粒度控制

之前曾经在WSFC日常管理操作篇和大家介绍过WSFC的维护模式,简单来说,从WSFC 2012开始,通过维护模式可以帮我们完成暂停节点,自动排水,自动回复的半自动化维护 回顾一下WSFC的维护模式运作流程,此处以WSFC 2012开始为例,在WSFC 2012之前,群集的维护模式仅能暂停节点,但无法自动移动负载 1.手动放置节点为暂停模式 2.节点根据群集角色优先级,参考放置策略,依次排水处理群集负载至合适节点 3.负载都排水到该去的节点后,节点宣告为暂停,不接受任何负载的迁移 4.维护完成后参

postgresql用户操作权限

对于postgresql来说,只有安装数据库时默认创建的超级用户postgres,类似于linux上的root用户,拥有 新建数据库用户:CREATE USER 新建数据库:CREATE DATABASE 删除数据库:DROP DATABASE 删除用户:DROP USER 撤销权限:REVOKE 赋权:GRANT 等一切数据库操作的权限,可直接操作所有数据库,其他普通用户则无权操作. 版权声明:本文为博主原创文章,未经博主允许不得转载.

PostgreSQL模式介绍

一个PostgreSQL数据库集群包含一个或多个已命名数据库.用户和用户组在整个集群范围内是共享的,但是其它数据并不共享.任何与服务器连接的客户都只能访问那个在连接请求里声明的数据库. 注意: 集群中的用户并不一定要有访问集群内所有数据库的权限.共享用户名的意思是不能有重名用户.假定同一个集群里有两个数据库和一个joe用户,系统可以配置成只允许joe 访问其中的一个数据库. 一个数据库包含一个或多个已命名的模式,模式又包含表.模式还可以包含其它对象,包括数据类型.函数.操作符等.同一个对象名可以

PostgreSQL获取操作影响的行数

如何来获取普通的操作所影响的行数,PostgreSQL里面有一个内置的变量DIAGNOSTICS与ROW_COUNT可以做到这一点. 一.环境: DB:9.4beta3 二.准备: postgres=# create table test(id int); CREATE TABLE postgres=# insert into test select generate_series(1,20); INSERT 0 20 postgres=# select * from test; id ----

PostgreSQL 数据库操作

创建数据库 CREATE DATABASE name [ [ WITH ] [ OWNER [=] user_name ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] [ TABLESPACE [=] tablespace_name ] [ CONNECTION LIMIT [=] connlimit ] ] 参数 name

关于postgresql——常用操作指令

该文章转载自http://blog.chinaunix.net/uid-22920230-id-3493064.html 创建数据库 CREATE DATABASE test WITH OWNER = postgres ENCODING = 'UTF8'; 进入控制台方法,在postgreSQL的安装目的bin下执行命令: psql 数据库名,  例: /usr/local/pgsql/bin/psql mydb 指定host.用户名和数据库的话,如: /usr/local/pgsql/bin/

postgresql模式创建、修改、删除

一个数据库包含一个或多个模式,而模式又包含表.序列.函数等,不同的模式可以包含相同名称的表.序列.函数等.模式本质上是命名空间,就像人的姓氏一样.一个用户只要有权限,连接到数据库后,可一次访问该数据库的任何模式下的对象.新建一个数据库会默认创建一个public模式,后续操作数据库对象如果没指定模式,则默认为public.例如之前创建的school数据库 school=# \dn+                          List of schemas  Name  |  Owner