2009-07-29 86 views
0

您如何閱讀以下代碼行? 代碼是從約翰桑德斯SO。 (請添加一個鏈接,如果你找到它)瞭解Postgres中的聲明

SET search_path TO so,"$user", public; 

語境

START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE; 
CREATE SCHEMA SO 
SET search_path TO so,"$user", public;  /// here 
... 

我看行「設置你所選擇的道路,以您的架構給定用戶公開「。 公衆似乎意味着PATH或用戶是公共的。 我不知道爲什麼我們需要配置變量用戶,因爲一切都是小寫。

+0

謝謝你的回答! – 2009-07-31 17:41:45

回答

2

設置search_path時,如果數據庫中有足夠多的表已被分成多個模式,那麼這種情況非常普遍。瞭解它的功能和用途的方法是從schema文檔開始,該文檔也涵蓋了公共模式的作用。當它出現在該路徑中的文檔描述了search_path

的方式$用戶取代:

「如果列表項之一是 特殊值$ user,那麼該模式 由 返回的名稱被替換,如果 是這樣的模式「。

顯然你的下一個問題是什麼SESSION_USER?這起始於您連接到數據庫的用戶名,但可以通過像SET SESSION AUTHORIZATION這樣的命令進行更改。這個想法是它可以幫助你爲每個用戶設置一個模式,這可以成爲鎖定每個用戶安全的有效方法。我只聽說過用於簡單的數據庫託管類型的環境,每個用戶都有自己的角色和模式,但沒有自己的數據庫。你可以把「$ user」部分留在那裏,不會影響任何東西,它只是默認顯示出來,如果你不依賴它,大多數人不知道你可以刪除它。

$用戶在引號中,因爲這是SQL標準中的reserved word。如果您必須在PostgreSQL中使用保留字,則可以使用保留字命名事物,即使這是一個壞主意,但您必須始終將它們放在引號中,以便SQL解析器不會誤解它們。如果您嘗試使用保留字作爲列或表的名稱,可能會導致奇怪的錯誤。除了「用戶」之外,您可能會偶然嘗試將其用作列名稱,因爲它們映射到常見的現實世界中,包括大小寫,默認,結束,完整,左側,新建,偏移量,順序和引用。

2

它在sql語句顯示時沒有顯式模式表示法設置當前數據庫連接的模式搜索順序。

在這種情況下,數據庫查詢引擎首先搜索模式'so',然後搜索與當前數據庫連接同名的模式,最後搜索名爲public的模式。我假設報價是因爲美元符號。

1

關於search_path選項的PostgreSQL文檔包含其目的的很好說明。

這可能是一種罕見的命令,因爲默認幾乎總是正是你想要的。我從來不需要在我所做的任何PostgreSQL工作中使用它。

+0

您可能會感興趣Greg的回答。他解釋了search_path及其應用。 – 2009-07-31 17:41:12