最近一些同學反應,POSTGRESQL 的用戶到底怎么回事,怎么這么亂,說這些話的是MYSQL的DB 同學.是的,如果之前是操作MYSQL 在使用了POSTGRESQL 后,是會感覺到,有點怪怪的,但如果你之前是使用ORACLE , SQL SERVER 這一類的資料庫那說怪怪的就有點,你是不是怪怪的. 所以我們來說說POSTGRESQL 的賬號和用戶的問題.
我們通過這個圖,我們先從概念上理解一下POSTGRESQL 的賬號到底是什么.首先POSTGRESQL 中用戶和角色可以認為是一個概念,之間的不同就是,角色沒有密碼,不能登錄,所以下面的圖大致的意思
如果一個POSTGRESQL Role 給了登錄的權限并且賦予密碼,那這個角色我們就可以認為他是一個用戶, 而反過來,如果我們不給這個賬號賦予登錄的權限,而是一個權限的集合,并且我們用這個"用戶" 來給更多的用戶賦予權限,那這個"用戶" 就是ROLE.
說完上面的這個概念,下面就的說說schema 的這個事情了,如果你用過SQL SERVER 或許你能很快的理解POSTGRESQL 的schema 到底是什么意思,而如果你是MYSQL 或者 ORACLE 的資深DB ,那可能會稍微的說一下.
1 ORACLE 資料庫本身是沒有 database 這個概念的, 他是通過SCHEMA 來將一堆的表進行劃分的,這對表屬于這個SCHEMA 而另一堆表屬于另一個SCHEMA
2 MYSQL 沒有SCHEMA 的概念,但有一個INSTANCE 下掛載多個資料庫的概念.
將ORACLE 的SCHEMA + MYSQL DATABASE = SQL SERVER AND POSTGRESQL 的用戶與SCHEMA 和DATABASE 之間的關系.
上面的圖就完美的解釋了DATABASE SCHEMA USER 之間的關系, 你中有我我中有你.
說完這個問題,其實還有一個問題,讓初學者很苦惱,就是建立一個用戶可以登陸的ROLE 后,新建一個資料庫,上去就可以做任何操作包括建表,那我們就來看看到底這是怎么回事, 一般上來的使用過其他資料庫的管理員,可能不大能理解這個問題.
我們要強調的是 ,新建的用戶一定會對于各種資料庫的PUBLIC,具有權限,如果用資料庫的角度可能SQL SERVER 的管理員 也不會能想的通,但是如果你用WINDOWS 的檔案夾的權限的 PUBLIC 的想法去想就能理解了.
那這里我們建立一個用戶首先要做的就是,
去掉資料庫的PUBLIC 下的所有權限,到你所屬的資料庫下執行下面的陳述句,這樣新建的用戶對于資料庫就不在有public schema下的所有權限了
revoke all on schema public from public;
這樣新建立的用戶就不會在登陸一個資料庫上可以隨意在PUBLIC SCHEMA 上建立任何的OBJECT
解決這個問題后,ORACLE 的DB 人員在schema 和用戶之間的關系方面,這對POSTGRESQL 是有不理解的情況.
首先public 的schema 我們可以洗掉嗎,可以
我們可以看到public是可以洗掉的,同時在創建表會失敗,那我們創建一個schema 看看會怎么樣
那這怎么辦呢,我們可以將POSTGRESQL的SCHEMA 的探測順序改變一下
show search_path;
我們通過 search_path 調整對
在創建表就不會報錯,而是根據相關的順序,將own 作為當前資料庫的第一個SCHEMA 進行默認.
這樣的做法可以改變在用戶默認的狀態下,創建的東西都默認到PUBLIC中的一些安全方面的問題.
其實這個問題和SQL SERVER 中默認的SCHEMA 是DBO是一樣的意思,每個資料庫主要創建表均在DBO SCHEMA 的模式下,進行權限的統一管理,這樣也沒有什么不好,但換到ORACLE的 DB 則不大會理解.
所以POSTGRESQL 在權限的管理和SCHEMA 的模式下的權限授予,ORACLE 和 MYSQL 的DB 可能會覺得迷惑.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218617.html
標籤:其他
上一篇:Redis開發與運維_讀書筆記
