Postgresql

Postgres 序列使用

  • November 22, 2013

我有一個包含兩個使用者的 Postgres 數據庫:devjunit. Junit 和 dev 對象會定期刪除和創建。

它們都有相同的對象未共享表,但是,序列是共享的,並且dev是所有者。我只是使用正常create的陳述。

我想grant alljunit這個序列,但這失敗了:

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它不是基本類型的名稱,也不是保留字,因此不會立即引起任何麻煩。

旁白:

不幸的是,手冊serialCREATE SEQUENCEALTER SEQUENCE範例中使用了名稱。我覺得對 pgsql-docs@postgresql.org 的建議可能是有序的……

SERIALINTEGER類型列的別名數據類型,其預設值來自序列。如果您將表定義為具有SERIAL類型列,則需要從表中獲取序列的實際名稱。

查看輸出並使用正確的序列名稱\d your_table重試您的命令。GRANT如果您確實GRANT將您的序列命名為“serial”(這是不明智的),那麼您應該在命令中使用雙引號“serial” 。

關於您的另一個問題,您可以將對象定義收集到一個(或多個)文件中。創建一個架構 fordev和另一個 for junit,然後使用其他腳本創建對象,例如

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;

引用自:https://dba.stackexchange.com/questions/53662