本頁面說明如何搭配使用精細存取控管和 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 (Ack 或 Delete) 從佇列確認或刪除訊息,請授予佇列 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 Ack 或 Delete) |
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 個佇列的檢視畫面
下列檢視畫面會顯示佇列的資料庫角色和權限資訊:
- GoogleSQL 方言資料庫:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - PostgreSQL 方言資料庫:
information_schema.table_privileges
由於 Spanner 會將佇列視為資料表層級的結構定義物件,因此在佇列上授予的權限會顯示在 TABLE_PRIVILEGES 中。佇列資料表值函式的授權會顯示在 ROUTINE_PRIVILEGES 中。
系統會根據目前資料庫角色的權限,篩選這些檢視表中的資料列。確保主體只能查看自己有權存取的角色、權限和佇列。
列篩選也適用於下列佇列中繼資料檢視畫面:
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
列篩選也適用於佇列資料表值函式 (RECEIVE_QUEUE_NAME 和 RENEWLEASE_QUEUE_NAME) 的中繼資料檢視畫面:
GoogleSQL
PostgreSQL
系統角色 spanner_info_reader 和其成員一律會看到未經過濾的 INFORMATION_SCHEMA。
注意事項和考量
TVF 執行和直接佇列查詢的專屬權限: 在佇列上授予
SELECT,不會在相關聯的資料表值函式上授予EXECUTE(RECEIVE_QUEUE_NAME或RENEWLEASE_QUEUE_NAME)。同樣地,在 TVF 上授予EXECUTE,不會在佇列上授予SELECT。- 如果佇列中只有
SELECT的角色嘗試執行RECEIVE_QUEUE_NAME(),Spanner 會傳回錯誤,指出該角色在資料表函式RECEIVE_QUEUE_NAME上沒有必要權限。 - 如果只有
EXECUTE權限的角色嘗試在 TVF 上執行SELECT * FROM QUEUE_NAME,Spanner 會傳回錯誤,指出該角色在佇列QUEUE_NAME上沒有必要權限。
- 如果佇列中只有
與變更串流的差異:與變更串流不同 (變更串流需要在串流上使用
SELECT,並在讀取函式上使用EXECUTE),佇列訊息消費者只需要在RECEIVETVF 上使用EXECUTE。佇列本身不需要SELECT。不支援資料欄層級的權限:與資料表不同,Spanner 不支援佇列的資料欄層級權限 (例如
GRANT SELECT (COLUMN_NAME) ON QUEUE)。由於佇列包含內部系統中繼資料欄,因此必須對整個佇列物件授予權限。區分生產者和消費者角色:建議為訊息生產者和訊息消費者定義不同的資料庫角色。例如:
- 佇列中只有
INSERT的製作人角色。 - 具有
EXECUTE權限的消費者角色,可對RECEIVE_QUEUE_NAME和RENEWLEASE_QUEUE_NAME函式執行作業,並在佇列中具有DELETE權限 (如要透過DELETE或Ack突變確認訊息)。
- 佇列中只有
直接 DML 與佇列 TVF 傳送:直接
DELETE或UPDATE陳述式會略過佇列租用和傳送狀態機器。建議您將這些權限限制為僅供管理或維護角色使用。