模式

什么是模式

模式是数据库中的一个概念,可以理解为一个命名空间或目录,不同的模式下可以有相同的表、函数等对象而不产生冲突。模式的提出是为了便于管理,只要有权限,各个模式中的对象可以互相调用。在PostgreSQL中,一个数据库可以包含一个或多个模式。

  • PostgreSQL:不能同时访问不同数据库中的对象,当要访问另一个数据库中的表或其他对象时,需要重新连接到这个数据库
  • MySQL:可以同时访问多个数据库中的对象,与PostgreSQL中可以同时访问多个Schema中的对象是一样的
  • Oracle:一个用户对应一个Schema

 

模式的使用

  • 创建模式
    testdb=> create schema gavin;
    CREATE SCHEMA
  • 查看模式
    testdb=> \dn 
    List of schemas
     Name  | Owner 
    -------+-------
     gavin | gavin
    (1 row)
  • 删除模式
    testdb=> drop schema gavin;
    DROP SCHEMA
  • 修改模式
    testdb=> alter schema gavin rename to whh; -- 修改模式名
    ALTER SCHEMA
    
    testdb=> alter schema whh owner to whh;  -- 修改模式属主
    ALTER SCHEMA

 

公共模式

通常情况下,创建和访问表都不用指定模式,实际上这时候访问的都是public模式。每当我们创建一个数据库时,PostrgreSQL会自动为我们创建一个名为public的模式。当登录数据库时,如果没有特意指定,都是以public模式操作各种数据库对象。建议不要使用甚至是删除public模式。

 

模式的搜索路径

  • 在搜索路径中第一个被找到的表被当做选定的表,如果搜索路径中没有匹配的表就会报错,即使匹配表的名称在数据库其他的模式中也会如此。
  • 搜索路径的第一个模式叫当前模式。除了是搜索的第一个模式之外,它还是在CREATE TABLE没有声明模式名时新建表所属的模式。
  • 显示当前搜索模式
    testdb=> show search_path ;
       search_path   
    -----------------
     "$user", public
    (1 row)
  • 修改搜索模式
    testdb=> set search_path="$user", public, whh;
    SET

 

模式的权限

  • 需要赋予USAGE权限,用户才能访问模式中的对象。如果要使用模式中的对象,可能还需要赋予适合该对象的额外权限
  • 模式情况下每个人在public模式下都有CREATE和USAGE权限,可以用以下语句插销这个权限
    testdb=> revoke create on schema public from PUBLIC;
    REVOKE

 

模式的可移植性

  • 为每个用户创建一个与用户名相同的模式,那么就能与Oracle兼容
  • 如果MySQL中有3个数据库,在移植到PostgreSQL中时,应创建3个模式与MySQL中的3个数据库对应,而不是在PostgreSQL中创建3个数据库与之对应

 

总结

  1. 删除public模式
  2. 为每个用户创建一个与用户名相同的模式

 

posted @ 2024-08-05 22:33  bingo-HF  阅读(2)  评论(0编辑  收藏  举报