Postgresql
Postgres 序列使用
我有一個包含兩個使用者的 Postgres 數據庫:
dev
和junit
. Junit 和 dev 對象會定期刪除和創建。它們都有相同的對象未共享表,但是,序列是共享的,並且
dev
是所有者。我只是使用正常create
的陳述。我想
grant all
為junit
這個序列,但這失敗了:dev=> grant all on sequence serial to junit; WARNING: no privileges were granted for "serial" GRANT
在這
junit
對序列沒有選擇權限之後,我該如何解決這個問題?我也想知道這種設置是否有配方,我可以在不修改腳本的情況下為兩個不同的使用者使用相同的 DDL?我一直在研究模式,但到目前為止我還沒有找到解決方案。
警告
WARNING: no privileges were granted for "serial"
表示授予角色沒有必要的權限來授予對相關對象的權限。
- 作為擁有該序列的角色執行
GRANT
命令。- 或者和超級使用者一樣(預設超級使用者是
postgres
)。- 或者
GRANT
該角色的必要特權,dev
以便該角色可以反過來將其授予其他人:GRANT ALL ON SEQUENCE serial TO dev **WITH GRANT OPTION**;
序列的名稱
serial
並不是特別明智,但由於serial
它不是基本類型的名稱,也不是保留字,因此不會立即引起任何麻煩。旁白:
不幸的是,手冊
serial
在CREATE SEQUENCE
和ALTER SEQUENCE
範例中使用了名稱。我覺得對 pgsql-docs@postgresql.org 的建議可能是有序的……
SERIAL
是INTEGER
類型列的別名數據類型,其預設值來自序列。如果您將表定義為具有SERIAL
類型列,則需要從表中獲取序列的實際名稱。查看輸出並使用正確的序列名稱
\d your_table
重試您的命令。GRANT
如果您確實GRANT
將您的序列命名為“serial”(這是不明智的),那麼您應該在命令中使用雙引號“serial” 。關於您的另一個問題,您可以將對象定義收集到一個(或多個)文件中。創建一個架構 for
dev
和另一個 forjunit
,然後使用其他腳本創建對象,例如SET ROLE TO dev; SET search_path TO dev; \i object_definitions.sql SET ROLE TO junit; SET search_path TO junit; \i object_definitions.sql RESET ROLE;