91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL中的模式、表、空間、用戶間的關系是什么

發布時間:2021-06-25 10:23:18 來源:億速云 閱讀:244 作者:chen 欄目:大數據

本篇內容主要講解“PostgreSQL中的模式、表、空間、用戶間的關系是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PostgreSQL中的模式、表、空間、用戶間的關系是什么”吧!

在平時的工作中,我們經常接觸到數據庫表用戶以及角色的使用,由于經常使用默認的數據庫表空間模式(Schema),所以我們往往忽略了數據庫表空間和模式的概念以及作用。

接下來,先介紹一下模式和表空間的定義以及作用。

什么是Schema?

一個數據庫包含一個或多個已命名的模式,模式又包含表。模式還可以包含其它對象, 包括數據類型函數操作符等。同一個對象名可以在不同的模式里使用而不會導致沖突; 比如,herschemamyschema都可以包含一個名為mytable的表。 和數據庫不同,模式不是嚴格分離的:只要有權限,一個用戶可以訪問他所連接的數據庫中的任意模式中的對象。

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

  • 允許多個用戶使用一個數據庫而不會干擾其它用戶。

  • 把數據庫對象組織成邏輯組,讓它們更便于管理。

  • 第三方的應用可以放在不同的模式中,這樣它們就不會和其它對象的名字沖突。

模式類似于操作系統層次的目錄,只不過模式不能嵌套。

什么是表空間?

表空間是實際的數據存儲的地方。一個數據庫schema可能存在于多個表空間,相似地,一個表空間也可以為多個schema服務。

通過使用表空間,管理員可以控制磁盤的布局。表空間的最常用的作用是優化性能,例如,一個最常用的索引可以建立在非常快的硬盤上,而不太常用的表可以建立在便宜的硬盤上,比如用來存儲用于進行歸檔文件的表。

PostgreSQL表空間、數據庫、模式、表、用戶、角色之間的關系

角色與用戶的關系

PostgreSQL中,存在兩個容易混淆的概念:角色/用戶。之所以說這兩個概念容易混淆,是因為對于PostgreSQL來說,這是完全相同的兩個對象。唯一的區別是在創建的時候:

  1. 我用下面的psql創建了角色custom:

CREATE ROLE custom PASSWORD 'custom';

接著我使用新創建的角色custom登錄,PostgreSQL給出拒絕信息:

FATAL:role 'custom' is not permitted to log in.

說明該角色沒有登錄權限,系統拒絕其登錄

  1. 我又使用下面的psql創建了用戶guest:

CREATE USER guest PASSWORD 'guest';

接著我使用guest登錄,登錄成功

難道這兩者有區別嗎?查看文檔,又這么一段說明:CREATE USER is the same as CREATE ROLE except that it implies LOGIN. ----CREATE USER除了默認具有LOGIN權限之外,其他與CREATE ROLE是完全相同的。

為了驗證這句話,修改custom的權限,增加LOGIN權限:

ALTER ROLE custom LOGIN;

再次用custom登錄,成功!那么事情就明了了:

CREATE ROLE custom PASSWORD 'custom' LOGIN 等同于 CREATE USER custom PASSWORD 'custom'.

這就是ROLE/USER的區別。

數據庫與模式的關系

模式(schema)是對數據庫(database)邏輯分割。

在數據庫創建的同時,就已經默認為數據庫創建了一個模式--public,這也是該數據庫的默認模式。所有為此數據庫創建的對象(表、函數、試圖、索引、序列等)都是創建在這個模式中的:

  1. 創建一個數據庫mars

CREATE DATABASE mars;
  1. custom角色登錄到mars數據庫,查看數據庫中的所有模式:\dn

PostgreSQL中的模式、表、空間、用戶間的關系是什么

顯示結果只有public一個模式。

  1. 創建一張測試表

CREATE TABLE test(id integer not null);
  1. 查看當前數據庫的列表:\d;

PostgreSQL中的模式、表、空間、用戶間的關系是什么

顯示結果是表test屬于模式public.也就是test表被默認創建在了public模式中。

  1. 創建一個新模式custom,對應于登錄用戶custom

CREATE SCHEMA custom;

ALTER SCHEMA custom OWNER TO custom;
  1. 再次創建一張test表,這次這張表要指明模式

CREATE TABLE custom.test (id integer not null);
  1. 查看當前數據庫的列表: \d

PostgreSQL中的模式、表、空間、用戶間的關系是什么

顯示結果是表test屬于模式custom.也就是這個test表被創建在了custom模式中。

得出結論是:數據庫是被模式(schema)來切分的,一個數據庫至少有一個模式,所有數據庫內部的對象(object)是被創建于模式的。用戶登錄到系統,連接到一個數據庫后,是通過該數據庫的search_path來尋找schema的搜索順序,可以通過命令SHOW search_path;具體的順序,也可以通過SET search_path TO 'schema_name'來修改順序。

官方建議是這樣的:在管理員創建一個具體數據庫后,應該為所有可以連接到該數據庫的用戶分別創建一個與用戶名相同的模式,然后,將search_path設置為$user,即默認的模式是與用戶名相同的模式。

表空間與數據庫的關系

數據庫創建語句:

CREATE DATABASE dbname;

默認的數據庫所有者是當前創建數據庫的角色,默認的表空間是系統的默認表空間pg_default

為什么是這樣的呢?

因為在PostgreSQL中,數據的創建是通過克隆數據庫模板來實現的,這與SQL SERVER是同樣的機制。由于CREATE DATABASE dbname并沒有指明數據庫模板,所以系統將默認克隆template1數據庫,得到新的數據庫dbname。(By default, the new database will be created by cloning the standard system database template1)

template1數據庫的默認表空間是pg_default,這個表空間是在數據庫初始化時創建的,所以所有template1中的對象將被同步克隆到新的數據庫中。

相對完整的語法應該是這樣的:

CREATE DATABASE dbname TEMPLATE template1 TABLESPACE tablespacename;
ALTER DATABASE dbname OWNER TO custom;
  1. 連接到template1數據庫,創建一個表作為標記:

CREATE TABLE test(id integer not null);

向表中插入數據

INSERT INTO test VALUES (1);
  1. 創建一個表空間:

CREATE TABLESPACE tsmars OWNER custom LOCATION '/tmp/data/tsmars';

在此之前應該確保目錄**/tmp/data/tsmars**存在,并且目錄為空。

  1. 創建一個數據庫,指明該數據庫的表空間是剛剛創建的tsmars

CREATE DATABASE dbmars TEMPLATE template1 OWNERE custom TABLESPACE tsmars;
ALTER DATABASE dbmars OWNER TO custom;
  1. 查看系統中所有數據庫的信息:\l+

PostgreSQL中的模式、表、空間、用戶間的關系是什么

可以發現,dbmars數據庫的表空間是tsmars,擁有者是custom;

仔細分析后,不難得出結論:

在PostgreSQL中,表空間是一個目錄,里面存儲的是它所包含的數據庫的各種物理文件

總結

表空間是一個存儲區域,在一個表空間中可以存儲多個數據庫,盡管PostgreSQL不建議這么做,但我們這么做完全可行。一個數據庫并不知直接存儲表結構等對象的,而是在數據庫中邏輯創建了至少一個模式,在模式中創建了表等對象,將不同的模式指派該不同的角色,可以實現權限分離,又可以通過授權,實現模式間對象的共享,并且還有一個特點就是:public模式可以存儲大家都需要訪問的對象。

表空間用于定義數據庫對象在物理存儲設備上的位置,不特定于某個單獨的數據庫。數據庫是數據庫對象的物理集合,而schema則是數據庫內部用于組織管理數據庫對象的邏輯集合,schema名字空間之下則是各種應用程序會接觸到的對象,比如表、索引、數據類型、函數、操作符等。

角色(用戶)則是數據庫服務器(集群)全局范圍內的權限控制系統,用于各種集群范圍內所有的對象權限管理。因此角色不特定于某個單獨的數據庫,但角色如果需要登錄數據庫管理系統則必須連接到一個數據庫上。角色可以擁有各種數據庫對象。

到此,相信大家對“PostgreSQL中的模式、表、空間、用戶間的關系是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白朗县| 灵川县| 肥城市| 交城县| 怀宁县| 三门峡市| 宁远县| 盐津县| 酒泉市| 栾城县| 陇西县| 墨竹工卡县| 镇原县| 分宜县| 喀喇| 许昌市| 瑞金市| 商南县| 平原县| 中卫市| 乐至县| 外汇| 睢宁县| 兰西县| 通城县| 浦城县| 永修县| 德昌县| 和平区| 阳曲县| 阿克苏市| 岗巴县| 新竹县| 营口市| 安康市| 长丰县| 岑溪市| 乡宁县| 商洛市| 奉贤区| 宜兰县|