佇列的精細存取控管機制

本頁面說明如何搭配使用精細存取控管和 Spanner 佇列,適用於 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫。

在 Spanner 中,佇列定義為結構定義物件。直接傳送訊息、接收訊息、延長訊息租約、確認及刪除訊息,或查詢佇列的權限,都符合標準的 Spanner 資料庫角色和權限。

傳送訊息的授權 (製作人)

如要使用 DML (INSERT INTO) 或 Mutation API 將訊息傳送至佇列 (請參閱「插入陳述式」),請將佇列的 INSERT 權限授予資料庫角色:

GoogleSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;

如要撤銷權限,請按照下列步驟操作:

GoogleSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

接收訊息的授權 (消費者)

如要從佇列串流處理訊息,取用端工作站會執行 RECEIVE_QUEUE_NAME() 資料表值函式 (TVF) 和 ExecuteStreamingSQL

如要允許資料庫角色從佇列串流傳送訊息,請在自動建立的 RECEIVE_QUEUE_NAME 函式上授予 EXECUTE

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;

如要撤銷權限,請按照下列步驟操作:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;

呼叫 RECEIVE_QUEUE_NAME() 時,只需要 TVF 上的 EXECUTE,不需要佇列上的 SELECT

延長訊息租約

消費者收到訊息時,Spanner 會指派初始 10 秒的租約。如果訊息處理時間超過初始租約,消費者必須使用 RENEWLEASE_QUEUE_NAME() TVF 延長租約。

如要延長租約,角色必須對 RENEWLEASE_QUEUE_NAME 函式具有 EXECUTE 權限:

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;

如要撤銷權限,請按照下列步驟操作:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;

呼叫 RENEWLEASE_QUEUE_NAME() 時,只需要 TVF 上的 EXECUTE,不需要佇列上的 SELECT

如要進一步瞭解如何接收訊息及延長租約,請參閱「使用佇列」。

直接查詢佇列的授權

如要使用標準 SQL (SELECT * FROM QUEUE_NAME) 或 Read API 直接從佇列讀取或檢查訊息,請在佇列上授予 SELECT 權限:

GoogleSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;

如要撤銷權限,請按照下列步驟操作:

GoogleSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

授予佇列的 SELECT 權限可讓您將佇列當做資料表查詢,但不會授予 RECEIVE_QUEUE_NAME()RENEWLEASE_QUEUE_NAME()EXECUTE 權限。

授予確認及刪除訊息的權限

如要使用 DML (DELETE FROM) 或 Mutation API (AckDelete) 從佇列確認或刪除訊息,請授予佇列 DELETE 權限:

GoogleSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;

如要撤銷權限,請按照下列步驟操作:

GoogleSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;

佇列作業所需的權限

下表摘要列出常見佇列作業所需的權限:

作業 所需權限
傳送訊息 (DML INSERT 或 Mutation API Send) INSERT 佇列
接收訊息 (RECEIVE_QUEUE_NAME() TVF) EXECUTE RECEIVE_QUEUE_NAME 函式
延長訊息租用期 (RENEWLEASE_QUEUE_NAME() TVF) EXECUTE RENEWLEASE_QUEUE_NAME 函式
確認或刪除訊息 (DML DELETE 或 Mutation API AckDelete) DELETE 佇列
直接讀取佇列資料 (SQL SELECT 或 Read API) SELECT 佇列

範例:設定製作人和消費者角色

以下範例會為名為 OrdersQueue 的佇列,設定生產者、消費者和稽核人員的個別資料庫角色:

GoogleSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;

PostgreSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;

INFORMATION_SCHEMA 個佇列的檢視畫面

下列檢視畫面會顯示佇列的資料庫角色和權限資訊:

由於 Spanner 會將佇列視為資料表層級的結構定義物件,因此在佇列上授予的權限會顯示在 TABLE_PRIVILEGES 中。佇列資料表值函式的授權會顯示在 ROUTINE_PRIVILEGES 中。

系統會根據目前資料庫角色的權限,篩選這些檢視表中的資料列。確保主體只能查看自己有權存取的角色、權限和佇列。

列篩選也適用於下列佇列中繼資料檢視畫面:

GoogleSQL

  • INFORMATION_SCHEMA.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_schema.columns

列篩選也適用於佇列資料表值函式 (RECEIVE_QUEUE_NAMERENEWLEASE_QUEUE_NAME) 的中繼資料檢視畫面:

系統角色 spanner_info_reader 和其成員一律會看到未經過濾的 INFORMATION_SCHEMA

注意事項和考量

  • TVF 執行和直接佇列查詢的專屬權限: 在佇列上授予 SELECT,不會在相關聯的資料表值函式上授予 EXECUTE (RECEIVE_QUEUE_NAMERENEWLEASE_QUEUE_NAME)。同樣地,在 TVF 上授予 EXECUTE,不會在佇列上授予 SELECT

    • 如果佇列中只有 SELECT 的角色嘗試執行 RECEIVE_QUEUE_NAME(),Spanner 會傳回錯誤,指出該角色在資料表函式 RECEIVE_QUEUE_NAME 上沒有必要權限。
    • 如果只有 EXECUTE 權限的角色嘗試在 TVF 上執行 SELECT * FROM QUEUE_NAME,Spanner 會傳回錯誤,指出該角色在佇列 QUEUE_NAME 上沒有必要權限。
  • 與變更串流的差異:與變更串流不同 (變更串流需要在串流上使用 SELECT,並在讀取函式上使用 EXECUTE),佇列訊息消費者只需要在 RECEIVE TVF 上使用 EXECUTE。佇列本身不需要 SELECT

  • 不支援資料欄層級的權限:與資料表不同,Spanner 不支援佇列的資料欄層級權限 (例如 GRANT SELECT (COLUMN_NAME) ON QUEUE)。由於佇列包含內部系統中繼資料欄,因此必須對整個佇列物件授予權限。

  • 區分生產者和消費者角色:建議為訊息生產者和訊息消費者定義不同的資料庫角色。例如:

    • 佇列中只有 INSERT 的製作人角色。
    • 具有 EXECUTE 權限的消費者角色,可對 RECEIVE_QUEUE_NAMERENEWLEASE_QUEUE_NAME 函式執行作業,並在佇列中具有 DELETE 權限 (如要透過 DELETEAck 突變確認訊息)。
  • 直接 DML 與佇列 TVF 傳送:直接 DELETEUPDATE 陳述式會略過佇列租用和傳送狀態機器。建議您將這些權限限制為僅供管理或維護角色使用。

後續步驟