在SQL标准里,同一个模式下的对象是不能被不同的用户拥有的,而且有些数据库系统不允许创建和它们的所有者不同名的模式,如Oracle数据库。
实际上,在那些只实现了标准中规定的基本模式的数据库系统里,模式和用户的概念几乎是一样的,比如Oracle数据库。因此,许多用户考虑对名字加以修饰,使它们真正由“username.tablename”组成。如果在PostgreSQL中为每个用户都创建一个与用户名同名的模式,那么就能与Oracle数据库兼容了。
同样,在SQL标准中也没有public模式的概念。为了最大限度地遵循标准,并且与其他数据库兼容(如Oracle数据库),建议不要使用(甚至是应该删除)public模式。
规划
数据库可以包含多个模式,本文规划每个库仅对应一个模式,用户权限仅包含对模式中对象的增删改查
创建用户
create user tencent identified by 'tencent';
创建数据库
create database tencent;
创建模式
公共模式的处理还需要调研,目前还没有资料显示必须要删除
\c tencent
drop schema public;
create schema tencent;
设置默认路径
$user表示用户名,在这里表示tencent
alter user tencent set search_path="$user",public;
授予权限
先赋予模式的权限
grant usage on schema tencent to tencent;
只对历史的一些对象授权,后期增加的对象是没有权限的,需要授予默认权限
grant select,insert,update,delete on all tables in schema tencent to tencent;
grant select,update on all sequences in schema tencent to tencent;
授予默认权限,后期增加的对象也会获得权限
ALTER DEFAULT PRIVILEGES IN SCHEMA tencent GRANT select,insert,update,delete ON TABLES TO tencent;
ALTER DEFAULT PRIVILEGES IN SCHEMA tencent GRANT select,update ON sequences TO tencent;