什么是schema?
這里只討論數(shù)據(jù)庫(kù)中的schema,而不討論XML中的schema。在wiki上,這樣解釋schema:
In a relational database, the schema defines the tables, views, indexes, packages,procedures, functions, queues, triggers, types, sequences, materialized views, synonyms,database links, directories, Java, XML schemas, and other elements.
而實(shí)際上,schema就是數(shù)據(jù)庫(kù)對(duì)象的集合。
我們先來(lái)看一下schema的定義:
A schema is a collection of database objects (used by a user.).Schema objects are the logical structures that directly refer to the database’s data.A user is a name defined in the database that can connect to and access objects.schema and users help database administrators manage database security.
從定義中我們可以看出schema為數(shù)據(jù)庫(kù)對(duì)象的集合,為了區(qū)分各個(gè)集合,我們需要給這個(gè)集合起個(gè)名字,這些名字就是我們?cè)谄髽I(yè)管理器的方案下看到的許多類(lèi)似用戶(hù)名的節(jié)點(diǎn),這些類(lèi)似用戶(hù)名的節(jié)點(diǎn)其實(shí)就是一個(gè)schema,schema里面包含了各種對(duì)象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一個(gè)用戶(hù)一般對(duì)應(yīng)一個(gè)schema,該用戶(hù)的schema名等于用戶(hù)名,并作為該用戶(hù)缺省schema。這也就是我們?cè)谄髽I(yè)管理器的方案下看到schema名都為數(shù)據(jù)庫(kù)用戶(hù)名的原因。Oracle數(shù)據(jù)庫(kù)中不能新創(chuàng)建一個(gè)schema,要想創(chuàng)建一個(gè)schema,只能通過(guò)創(chuàng)建一個(gè)用戶(hù)的方法解決(Oracle中雖然有create schema語(yǔ)句,但是它并不是用來(lái)創(chuàng)建一個(gè)schema的),在創(chuàng)建一個(gè)用戶(hù)的同時(shí)為這個(gè)用戶(hù)創(chuàng)建一個(gè)與用戶(hù)名同名的schema并作為該用戶(hù)的缺省schema。即schema的個(gè)數(shù)同user的個(gè)數(shù)相同,而且schema名字同user名字一一對(duì)應(yīng)并且相同,所有我們可以稱(chēng)schema為user的別名,雖然這樣說(shuō)并不準(zhǔn)確,但是更容易理解一些。
一個(gè)用戶(hù)有一個(gè)缺省的schema,其schema名就等于用戶(hù)名,當(dāng)然一個(gè)用戶(hù)還可以使用其他的schema。如果我們?cè)L問(wèn)一個(gè)表時(shí),沒(méi)有指明該表屬于哪一個(gè)schema中的,系統(tǒng)就會(huì)自動(dòng)給我們?cè)诒砩霞由先笔〉膕chema名。比如我們?cè)谠L(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí),訪(fǎng)問(wèn)freeoa用戶(hù)下的temp表,通過(guò)select * from temp; 其實(shí),這sql語(yǔ)句的完整寫(xiě)法為select * from freeoa.temp。在數(shù)據(jù)庫(kù)中一個(gè)對(duì)象的完整名稱(chēng)為schema.object,而不屬u(mài)ser.object。類(lèi)似如果我們?cè)趧?chuàng)建對(duì)象時(shí)不指定該對(duì)象的schema,在該對(duì)象的schema為用戶(hù)的缺省schema。這就像一個(gè)用戶(hù)有一個(gè)缺省的表空間,但是該用戶(hù)還可以使用其他的表空間,如果我們?cè)趧?chuàng)建對(duì)象時(shí)不指定表空間,則對(duì)象存儲(chǔ)在缺省表空間中,要想讓對(duì)象存儲(chǔ)在其他表空間中,我們需要在創(chuàng)建對(duì)象時(shí)指定該對(duì)象的表空間。
為什么schema有存在的必要?
為了區(qū)分各個(gè)集合,我們需要給這個(gè)集合起個(gè)名字,其實(shí)這個(gè)名字就是schema。
舉例說(shuō)明:
訪(fǎng)問(wèn)freeoa用戶(hù)下的temp表,通過(guò)select from temp 其實(shí)這條sql語(yǔ)句的完整寫(xiě)法為select from freeoa.temp。對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),不同的用戶(hù),有不同schema。有不同的表。實(shí)際在使用上,schema和user完全一樣,沒(méi)有什么區(qū)別,在出現(xiàn)schema名的地方也可以出現(xiàn)user名。
查看schema
postgres=# \dn
List of schemas
Name | Owner
--------+----------
public | postgres
(1 row)
什么是表空間?
表空間是實(shí)際的數(shù)據(jù)存儲(chǔ)的地方。一個(gè)數(shù)據(jù)庫(kù)schema可能存在于多個(gè)表空間,相似地,一個(gè)表空間也可以為多個(gè)schema服務(wù)。
postgres=# select * from pg_tablespace;
spcname | spcowner | spcacl | spcoptions
------------+----------+--------+------------
pg_default | 10 | |
pg_global | 10 | |
(2 rows)
表空間的作用:
通過(guò)使用表空間,管理員可以控制磁盤(pán)的布局。表空間的最常用的作用是優(yōu)化性能,例如,一個(gè)最常用的索引可以建立在非??斓挠脖P(pán)上,而不太常用的表可以建立在便宜的硬盤(pán)上,比如用來(lái)存儲(chǔ)用于進(jìn)行歸檔文件的表。
PostgreSQL表空間、數(shù)據(jù)庫(kù)、模式、表、用戶(hù)、角色之間的關(guān)系
- 角色與用戶(hù)的關(guān)系
在PostgreSQL中,存在兩個(gè)容易混淆的概念:角色/用戶(hù)。之所以說(shuō)這兩個(gè)概念容易混淆,是因?yàn)閷?duì)于PostgreSQL來(lái)說(shuō),這是完全相同的兩個(gè)對(duì)象。唯一的區(qū)別是在創(chuàng)建的時(shí)候:
- 我用下面的psql創(chuàng)建了角色freeoa:
CREATE ROLE freeoa PASSWORD 'freeoa';
接著我使用新創(chuàng)建的角色freeoa登錄,PostgreSQL給出拒絕信息:
FATAL:role 'freeoa' is not permitted to log in.
說(shuō)明該角色沒(méi)有登錄權(quán)限,系統(tǒng)拒絕其登錄。
- 我又使用下面的psql創(chuàng)建了用戶(hù)freeoa2:
CREATE USER freeoa2 PASSWORD 'freeoa2';
接著我使用freeoa2登錄,登錄成功。難道這兩者有區(qū)別嗎?查看文檔,又這么一段說(shuō)明:
"CREATE USER is the same as CREATE ROLE except that it implies LOGIN."----CREATE USER除了默認(rèn)具有LOGIN權(quán)限之外,其他與CREATE ROLE是完全相同的。
為了驗(yàn)證這句話(huà),修改freeoa的權(quán)限,增加LOGIN權(quán)限:ALTER ROLE freeoa LOGIN;再次用freeoa登錄,成功!那么事情就明了了:CREATE ROLE freeoa PASSWORD 'freeoa' LOGIN 等同于CREATE USER freeoa PASSWORD 'freeoa'.這就是ROLE/USER的區(qū)別。
數(shù)據(jù)庫(kù)與模式的關(guān)系
模式(schema)是對(duì)數(shù)據(jù)庫(kù)(database)邏輯分割。
在數(shù)據(jù)庫(kù)創(chuàng)建的同時(shí),就已經(jīng)默認(rèn)為數(shù)據(jù)庫(kù)創(chuàng)建了一個(gè)模式--public,這也是該數(shù)據(jù)庫(kù)的默認(rèn)模式。所有為此數(shù)據(jù)庫(kù)創(chuàng)建的對(duì)象(表、函數(shù)、試圖、索引、序列等)都是常見(jiàn)在這個(gè)模式中的:
1.創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)dba----CREATE DATABASE dba;
2.用freeoa角色登錄到dbtt數(shù)據(jù)庫(kù),查看dbtt數(shù)據(jù)庫(kù)中的所有模式:\dn; 顯示結(jié)果是只有public一個(gè)模式。
3.創(chuàng)建一張測(cè)試表----CREATE TABLE test(id integer not null);
4.查看當(dāng)前數(shù)據(jù)庫(kù)的列表:\d; 顯示結(jié)果是表test屬于模式public.也就是test表被默認(rèn)創(chuàng)建在了public模式中。
5.創(chuàng)建一個(gè)新模式freeoa,對(duì)應(yīng)于登錄用戶(hù)freeoa:CREATE SCHEMA freeoa OWNER freeoa;
6.再次創(chuàng)建一張test表,這次這張表要指明模式----CREATE TABLE freeoa.test (id integer not null);
7.查看當(dāng)前數(shù)據(jù)庫(kù)的列表:\d; 顯示結(jié)果是表test屬于模式freeoa.也就是這個(gè)test表被創(chuàng)建在了freeoa模式中。
得出結(jié)論是:數(shù)據(jù)庫(kù)是被模式(schema)來(lái)切分的,一個(gè)數(shù)據(jù)庫(kù)至少有一個(gè)模式,所有數(shù)據(jù)庫(kù)內(nèi)部的對(duì)象(object)是被創(chuàng)建于模式的。用戶(hù)登錄到系統(tǒng),連接到一個(gè)數(shù)據(jù)庫(kù)后,是通過(guò)該數(shù)據(jù)庫(kù)的search_path來(lái)尋找schema的搜索順序,可以通過(guò)命令SHOW search_path;具體的順序,也可以通過(guò)SET search_path TO 'schema_name'來(lái)修改順序。
官方建議是這樣的:在管理員創(chuàng)建一個(gè)具體數(shù)據(jù)庫(kù)后,應(yīng)該為所有可以連接到該數(shù)據(jù)庫(kù)的用戶(hù)分別創(chuàng)建一個(gè)與用戶(hù)名相同的模式,然后將search_path設(shè)置為"$user",這樣,任何當(dāng)某個(gè)用戶(hù)連接上來(lái)后,會(huì)默認(rèn)將查找或者定義的對(duì)象都定位到與之同名的模式中。對(duì)于一個(gè)應(yīng)用程序分很多相對(duì)獨(dú)立的模塊,每個(gè)模塊有相對(duì)獨(dú)立的數(shù)據(jù)結(jié)構(gòu),可以采用每個(gè)模塊一個(gè)數(shù)據(jù)庫(kù)用戶(hù)及與其名字相同的schema來(lái)組織數(shù)據(jù)庫(kù),并且整個(gè)的物理數(shù)據(jù)庫(kù)放在一個(gè)單獨(dú)的表空間中。使用這種數(shù)據(jù)庫(kù)管理模式,可以撤銷(xiāo)掉對(duì)public schema的訪(fǎng)問(wèn)許可,甚至把public schema直接移除,這樣每個(gè)用戶(hù)就真正的限定在了他們自己的schema里。
表空間與數(shù)據(jù)庫(kù)的關(guān)系
數(shù)據(jù)庫(kù)創(chuàng)建語(yǔ)句CREATE DATABASE dbname 默認(rèn)的數(shù)據(jù)庫(kù)所有者是當(dāng)前創(chuàng)建數(shù)據(jù)庫(kù)的角色,默認(rèn)的表空間是系統(tǒng)的默認(rèn)表空間--pg_default。
為什么是這樣的呢?因?yàn)樵赑ostgreSQL中,數(shù)據(jù)的創(chuàng)建是通過(guò)克隆數(shù)據(jù)庫(kù)模板來(lái)實(shí)現(xiàn)的,這與SQL SERVER是同樣的機(jī)制。由于CREATE DATABASE dbname并沒(méi)有指明數(shù)據(jù)庫(kù)模板,所以系統(tǒng)將默認(rèn)克隆template1數(shù)據(jù)庫(kù),得到新的數(shù)據(jù)庫(kù)dbname。(By default, the new database will be created by cloning the standard system database template1).
而template1數(shù)據(jù)庫(kù)的默認(rèn)表空間是pg_default,這個(gè)表空間是在數(shù)據(jù)庫(kù)初始化時(shí)創(chuàng)建的,所以所有template1中的對(duì)象將被同步克隆到新的數(shù)據(jù)庫(kù)中。相對(duì)完整的語(yǔ)法應(yīng)該是這樣的:CREATE DATABASE dbname OWNER freeoa TEMPLATE template1 TABLESPACE tablespacename;
1.連接到template1數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)表作為標(biāo)記:CREATE TABLE tbl_flag(id integer not null);向表中插入數(shù)據(jù)INSERT INTO tbl_flag VALUES (1);
2.創(chuàng)建一個(gè)表空間:CREATE TABLESPACE tsfreeoa OWNER freeoa LOCATION '/tmp/data/tsfreeoa';在此之前應(yīng)該確保目錄/tmp/data/tsfreeoa存在,并且目錄為空。
3.創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),指明該數(shù)據(jù)庫(kù)的表空間是剛剛創(chuàng)建的tsfreeoa:CREATE DATABASE dbfreeoa TEMPLATE template1 OWNERE freeoa TABLESPACE tsfreeoa;
4.查看系統(tǒng)中所有數(shù)據(jù)庫(kù)的信息:\l;可以發(fā)現(xiàn),dbfreeoa數(shù)據(jù)庫(kù)的表空間是tsfreeoa,擁有者是freeoa;
5.連接到dbfreeoa數(shù)據(jù)庫(kù),查看所有表結(jié)構(gòu):\d;可以發(fā)現(xiàn),在剛創(chuàng)建的數(shù)據(jù)庫(kù)中居然有了一個(gè)表tbl_flag,查看該表數(shù)據(jù),輸出結(jié)果一行一列,其值為1,說(shuō)明,該數(shù)據(jù)庫(kù)的確是從template1克隆而來(lái)。
仔細(xì)分析后,不難得出結(jié)論:在PostgreSQL中,表空間是一個(gè)目錄,里面存儲(chǔ)的是它所包含的數(shù)據(jù)庫(kù)的各種物理文件。
總結(jié)一下它們之間的關(guān)系
表空間是一個(gè)存儲(chǔ)區(qū)域,在一個(gè)表空間中可以存儲(chǔ)多個(gè)數(shù)據(jù)庫(kù),盡管PostgreSQL不建議這么做,但我們這么做完全可行。一個(gè)數(shù)據(jù)庫(kù)并不知直接存儲(chǔ)表結(jié)構(gòu)等對(duì)象的,而是在數(shù)據(jù)庫(kù)中邏輯創(chuàng)建了至少一個(gè)模式,在模式中創(chuàng)建了表等對(duì)象,將不同的模式指派該不同的角色,可以實(shí)現(xiàn)權(quán)限分離,又可以通過(guò)授權(quán),實(shí)現(xiàn)模式間對(duì)象的共享,并且還有一個(gè)特點(diǎn)就是:public模式可以存儲(chǔ)大家都需要訪(fǎng)問(wèn)的對(duì)象。
既然一個(gè)表在創(chuàng)建的時(shí)候可以指定表空間,那么是否可以給一個(gè)表指定它所在的數(shù)據(jù)庫(kù)表空間之外的表空間呢?
答案是肯定的,這么做完全可以:那這不是違背了表屬于模式,而模式屬于數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)最終存在于指定表空間這個(gè)網(wǎng)的模型了嗎?
是的,看上去這確實(shí)是不合常理的,但這么做又是有它的道理的,而且現(xiàn)實(shí)中,我們往往需要這么做:將表的數(shù)據(jù)存在一個(gè)較慢的磁盤(pán)上的表空間,而將表的索引存在于一個(gè)快速的磁盤(pán)上的表空間。但我們?cè)俨榭幢硭鶎俚哪J竭€是沒(méi)變的,它依然屬于指定的模式。所以這并不違反常理。實(shí)際上PostgreSQL并沒(méi)有限制一張表必須屬于某個(gè)特定的表空間,我們之所以會(huì)這么認(rèn)為,是因?yàn)樵陉P(guān)系遞進(jìn)時(shí),偷換了一個(gè)概念:模式是邏輯存在的,它不受表空間的限制。
表空間、數(shù)據(jù)庫(kù)、角色、模式及表之間的關(guān)系
表空間用于定義數(shù)據(jù)庫(kù)對(duì)象在物理存儲(chǔ)設(shè)備上的位置,不特定于某個(gè)單獨(dú)的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)對(duì)象的物理集合,而schema則是數(shù)據(jù)庫(kù)內(nèi)部用于組織管理數(shù)據(jù)庫(kù)對(duì)象的邏輯集合,schema名字空間之下則是各種應(yīng)用程序會(huì)接觸到的對(duì)象,比如表、索引、數(shù)據(jù)類(lèi)型、函數(shù)、操作符等。
角色(用戶(hù))則是數(shù)據(jù)庫(kù)服務(wù)器(集群)全局范圍內(nèi)的權(quán)限控制系統(tǒng),用于各種集群范圍內(nèi)所有的對(duì)象權(quán)限管理。因此角色不特定于某個(gè)單獨(dú)的數(shù)據(jù)庫(kù),但角色如果需要登錄數(shù)據(jù)庫(kù)管理系統(tǒng)則必須連接到一個(gè)數(shù)據(jù)庫(kù)上。角色可以擁有各種數(shù)據(jù)庫(kù)對(duì)象。對(duì)模式還是有疑問(wèn),那繼續(xù)讀下面的章節(jié)吧。
再說(shuō)一遍模式(Schema)
一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)集群包含一個(gè)或多個(gè)命名的數(shù)據(jù)庫(kù)。用戶(hù)和用戶(hù)組在整個(gè)集群的范圍內(nèi)是共享的,但是其它數(shù)據(jù)并不是共享的。任何給定的與服務(wù)器的客戶(hù)連接都只能訪(fǎng)問(wèn)在一個(gè)數(shù)據(jù)庫(kù)里的數(shù)據(jù),就是那個(gè)在連接請(qǐng)求里聲明的。
注意:一個(gè)集群的用戶(hù)并不一定要有訪(fǎng)問(wèn)集群內(nèi)所有數(shù)據(jù)庫(kù)的權(quán)限。 共享用戶(hù)名的意思是不能有同名用戶(hù),也就是在同一個(gè)集群里的兩個(gè)數(shù)據(jù)庫(kù)里都有叫 oafree 的用戶(hù),但是系統(tǒng)可以配置成只允許 oafree 訪(fǎng)問(wèn)某些數(shù)據(jù)庫(kù)。
一個(gè)數(shù)據(jù)庫(kù)包含一個(gè)或多個(gè)命名的模式,模式又包含表。模式還包含其它命名的對(duì)象,包括數(shù)據(jù)類(lèi)型、函數(shù)、序列以及操作符。同一個(gè)對(duì)象名可以在不同的模式里使用而不會(huì)導(dǎo)致沖突; 比如,schema1 和 myschema 都可以包含叫做 mytable 的表。和數(shù)據(jù)庫(kù)不同,模式不是嚴(yán)格分離的:一個(gè)用戶(hù)可以訪(fǎng)問(wèn)他所連接的數(shù)據(jù)庫(kù)中的任意模式中的對(duì)象,只要他有權(quán)限。
我們需要模式的原因有好多:
允許多個(gè)用戶(hù)使用一個(gè)數(shù)據(jù)庫(kù)而不會(huì)干擾其它用戶(hù)。
把數(shù)據(jù)庫(kù)對(duì)象組織成邏輯組,讓它們更便于管理。
第三方的應(yīng)用可以放在不同的模式中, 這樣它們就不會(huì)和其它對(duì)象的名字沖突。
模式類(lèi)似于操作系統(tǒng)層次的目錄,只不過(guò)模式不能嵌套。
創(chuàng)建一個(gè)schema
創(chuàng)建一個(gè)模式(schema)使用CREATE SCHEMA命令,如:
create schema freeoa_schema;
在指定模式里創(chuàng)建表,如:
CREATE TABLE myschema.mytable (
...
);
刪除一個(gè)空的schema,如:
drop schema myschema;
刪除一個(gè)模式以及模式里面所有的對(duì)象,如:
drop schema myschema CASCADE;
pulic schema(public 模式)
在創(chuàng)建表時(shí),如果沒(méi)有指定schema,則表會(huì)自動(dòng)被歸屬到一個(gè)叫做'public‘的模式中,每一個(gè)數(shù)據(jù)庫(kù)中都會(huì)有一個(gè)這樣的模式,它會(huì)自動(dòng)創(chuàng)建。下面兩種創(chuàng)建表的方式是等效的:
CREATE TABLE tableName(...);
和
CREATE TABLE public.tableName(...);
模式和權(quán)限
缺省時(shí),用戶(hù)看不到模式中不屬于他們所有的對(duì)象。為了讓他們看得見(jiàn),模式的所有者需要在模式上賦予 USAGE 權(quán)限。為了讓用戶(hù)使用模式中的對(duì)象,我們可能需要賦予額外的權(quán)限, 只要是適合該對(duì)象的。
用戶(hù)也可以允許在別人的模式里創(chuàng)建對(duì)象。要允許這么做, 我們需要賦予在該模式上的 CREATE 權(quán)限。 請(qǐng)注意,缺省每個(gè)人都在 public 模式上 有 CREATE 權(quán)限。這樣就允許所有可以連接到 指定數(shù)據(jù)庫(kù)上的用戶(hù)在這里創(chuàng)建對(duì)象。如果你不允許這么做, 你可以撤銷(xiāo)這個(gè)權(quán)限:
REVOKE CREATE ON public FROM PUBLIC;
(第一個(gè) "public" 是模式,第二個(gè) "public" 意思是"所有用戶(hù)"。 第一句里它是個(gè)標(biāo)識(shí)符,而第二句里是個(gè)關(guān)鍵字,所以有不同的大小寫(xiě))
模式搜索路徑
全稱(chēng)的名字寫(xiě)起來(lái)非常費(fèi)勁,并且我們最好不要在應(yīng)用里直接 寫(xiě)上特定的模式名。因此,表通常都是用未修飾的名字引用的,這樣的名字里只有表名字。系統(tǒng)通過(guò)查找一個(gè)搜索路徑 來(lái)判斷一個(gè)表究竟是哪個(gè)表,這個(gè)路徑是一個(gè)需要查找的模式列表。在搜索路徑里找到的第一個(gè)表將被當(dāng)作選定的表。如果在搜索路徑中沒(méi)有匹配表,那么就報(bào)告一個(gè)錯(cuò)誤,即使匹配表的名字在數(shù)據(jù)庫(kù)其它的 模式中存在也如此。
在搜索路徑中的第一個(gè)模式叫做當(dāng)前模式。除了是搜索的第一個(gè)模式之外, 它還是在 CREATE TABLE 沒(méi)有聲明模式名的時(shí)候,新建表所在的地方。這個(gè)與shell的PATH變量很相似。
查看當(dāng)前搜索路徑,使用命令:
SHOW search_path;
在缺省的設(shè)置中,返回下面的東西:
search_path
$user,public
第一個(gè)值聲明將要搜索一個(gè)和當(dāng)前用戶(hù)同名的模式。 因?yàn)檫€沒(méi)有這樣的模式存在,所以這條記錄被忽略。第二個(gè)值指向public模式。
要把新的模式放到路徑中來(lái),我們用
SET search_path TO myschema,public;
使用方式
模式可以以多種方式組織你的數(shù)據(jù)。下面是一些建議使用的模式, 它們也很容易在缺省配置中得到支持:
如果你沒(méi)有創(chuàng)建任何模式,那么所有用戶(hù)隱含都訪(fǎng)問(wèn)public模式。這樣就模擬了還沒(méi)有模式的時(shí)候的情景。這種設(shè)置建議主要用在只有一個(gè)用戶(hù)或者數(shù)據(jù)庫(kù)里只有幾個(gè)合作用戶(hù)的情形。這樣的設(shè)置也允許我們平滑地從無(wú)模式的環(huán)境過(guò)渡。
你可以為每個(gè)用戶(hù)創(chuàng)建一個(gè)模式,名字和用戶(hù)相同。要記得缺省的搜索路徑從$user開(kāi)始,它會(huì)解析為用戶(hù)名。如果每個(gè)用戶(hù)都有一個(gè)獨(dú)立的模式,那么他們?nèi)笔r(shí)訪(fǎng)問(wèn)他們自己的模式。如果你使用了這樣的設(shè)置,那么你可能還想撤銷(xiāo)對(duì)public模式的訪(fǎng)問(wèn)(或者一并刪除),因此用戶(hù)就真的限制于他們自己的模式中了。
要安裝共享的應(yīng)用(被所有人使用的表,第三方提供的額外的函數(shù)等等),可以把它們放到獨(dú)立的模式中,只要記得給訪(fǎng)問(wèn)它們的用戶(hù)賦予合適的權(quán)限就可以了。然后用戶(hù)就可以通過(guò)用一個(gè)模式名修飾這些名字來(lái)使用這些額外的對(duì)象,或者可以把額外的模式放到他們的搜索路徑中,由用戶(hù)來(lái)定。
發(fā)現(xiàn)更多寶藏
我在喜馬拉雅上分享聲音
《PostgreSQL數(shù)據(jù)庫(kù)內(nèi)核分析》,點(diǎn)開(kāi)鏈接可以聽(tīng)聽(tīng),有點(diǎn)意思。
《數(shù)據(jù)庫(kù)系統(tǒng)概論(第4版)》,點(diǎn)開(kāi)鏈接可以聽(tīng)聽(tīng),有點(diǎn)意思。
更多IT有聲課程,點(diǎn)我發(fā)現(xiàn)更多
其他相關(guān)文章分享列表:
第 23 課 PostgreSQL 創(chuàng)建自己的數(shù)據(jù)庫(kù)、模式、用戶(hù)
第 22 課 PostgreSQL 控制文件
第 21 課 PostgreSQL 日志系統(tǒng)
第 16 課 查詢(xún)過(guò)程源碼分析
第 15 課 PostgreSQL 系統(tǒng)參數(shù)配置
第 14 課 PostgreSQL 數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
第 13 課 PostgreSQL 存儲(chǔ)之Page(頁(yè)面)源碼分析
第 12 課 PostgreSQL 認(rèn)證方式
第 11 課 PostgreSQL 增加一個(gè)內(nèi)核C函數(shù)
第 10 課 PostgreSQL 在內(nèi)核增加一個(gè)配置參數(shù)
第 09 課 PostgreSQL 4種進(jìn)程啟動(dòng)方式
第 08 課 PostgreSQL 事務(wù)介紹
第 07 課 PostgreSQL 數(shù)據(jù)庫(kù)、模式、表、空間、用戶(hù)間的關(guān)系
第 06 課 PostgreSQL 系統(tǒng)表介紹
第 05 課 PostgreSQL 編譯源代碼進(jìn)行開(kāi)發(fā)
第 04 課 PostgreSQL 安裝最新的版本
第 03 課 PostgreSQL 代碼結(jié)構(gòu)
第 02 課 PostgreSQL 的特性、應(yīng)用、安裝
第 01 課 PostgreSQL 簡(jiǎn)介及發(fā)展歷程
上面文章都在專(zhuān)輯中:PostgreSQL專(zhuān)輯鏈接,點(diǎn)我查看
如果有用,可以收藏這篇文件,隨時(shí)在更新....
更多交流加群: PostgreSQL內(nèi)核開(kāi)發(fā)群 876673220
親,記得點(diǎn)贊、留言、打賞額?。?!