精細的存取權控管權限

本頁面說明可授予資料庫角色的權限,以便精細的存取控管。這項資訊適用於 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫。

如要瞭解資料庫角色和精細的存取控管,請參閱「精細的存取控管總覽」。

下表列出精細的存取控管權限,以及可授予這些權限的資料庫物件。

選取 INSERT 更新 刪除 執行 用量
結構定義 ✓
資料表 ✓ ✓ ✓ ✓
欄 ✓ ✓ ✓ ✓
查看 ✓
變更串流 ✓
變更串流讀取函式 ✓
順序 ✓ ✓
模型 ✓

以下各節將詳細說明各項權限。

SELECT

允許角色讀取或查詢資料表、檢視表、變更串流、序列或模型。

  • 如果為資料表指定資料欄清單,則權限僅對這些資料欄有效。如未指定資料欄清單,則權限對資料表中的所有資料欄都有效,包括之後新增的資料欄。檢視表不允許使用資料欄清單。

  • Spanner 支援叫用者權限檢視表和定義者權限檢視表。詳情請參閱「檢視表總覽」。

    如果您以叫用者權限建立檢視表,則資料庫角色或使用者必須具備檢視表的 SELECT 權限,以及檢視表中參照的基礎物件 SELECT 權限,才能查詢檢視表。舉例來說,假設檢視表 SingerNames 是在 Singers 資料表上建立。

    CREATE VIEW SingerNames SQL SECURITY INVOKER AS
    SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;
    

    假設資料庫角色 myRole 執行查詢 SELECT * FROM SingerNames。角色必須具備檢視表的 SELECT 權限,以及三個參照資料欄或整個 Singers 資料表的 SELECT 權限。

    如果您建立具有定義者權限的檢視表,則資料庫角色或使用者只需要檢視表的 SELECT 權限,即可查詢檢視表。舉例來說,假設檢視表 AlbumsBudget 是在 Albums 資料表上建立。

    CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS
    SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
    

    假設資料庫角色 Analyst 執行查詢 SELECT * FROM AlbumsBudget。該角色只需要檢視表的 SELECT 權限。不需要三個參照資料欄或 Albums 資料表的 SELECT 權限。

  • 在資料表的部分資料欄授予 SELECT 後,精細存取控管使用者就無法再對該資料表使用 SELECT *。對該資料表執行查詢時,必須指定要納入的所有資料欄。

  • 在生成資料欄上授予 SELECT,並不會在基礎資料欄上授予 SELECT。

  • 如果是交錯式資料表,在父項資料表上授予的 SELECT 不會傳播至子項資料表。

  • 授予變更串流的 SELECT 時,也必須授予變更串流資料表值函式的 EXECUTE。詳情請參閱「EXECUTE」。

  • 如果 SELECT 與特定資料欄的匯總函式 (例如 SUM(col_a)) 搭配使用,角色必須具備這些資料欄的 SELECT 權限。如果匯總函式未指定任何資料欄 (例如 COUNT(*)),則角色必須對資料表中的至少一欄具備 SELECT 權限。

  • 搭配序列使用 SELECT 時,您只能查看有權查看的序列。

GRANT SELECT 的使用範例

GoogleSQL

GRANT SELECT ON TABLE employees TO ROLE hr_director;

GRANT SELECT ON TABLE customers, orders, items TO ROLE account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO ROLE hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO ROLE hr_rep;

GRANT SELECT ON VIEW orders_view TO ROLE hr_manager;

GRANT SELECT ON CHANGE STREAM ordersChangeStream TO ROLE hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO ROLE role_name;

PostgreSQL

GRANT SELECT ON TABLE employees TO hr_director;

GRANT SELECT ON TABLE customers, orders, items TO account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO hr_rep;

GRANT SELECT ON TABLE orders_view TO hr_manager; // orders_view is an invoker rights view

GRANT SELECT ON CHANGE STREAM orders_change_stream TO hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO hr_package;

INSERT

允許角色在指定資料表中插入資料列。如果指定資料欄清單,則權限僅對這些資料欄有效。如未指定資料欄清單,則權限適用於資料表中的所有資料欄。

  • 如果指定資料欄名稱,則未包含的任何資料欄在插入時都會取得預設值。

  • 無法對生成資料欄授予INSERT。

GRANT INSERT 的使用範例

GoogleSQL

GRANT INSERT ON TABLE employees, contractors TO ROLE hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT INSERT ON TABLE employees, contractors TO hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO hr_rep;

UPDATE

允許角色更新指定資料表中的資料列。更新作業可以限制在資料表資料欄的子集。如果與序列搭配使用,角色就能對序列呼叫 get-next-sequence-value 函式。

除了 UPDATE 權限外,角色還需要所有查詢資料欄的 SELECT 權限。查詢的資料欄包括 WHERE 子句中的資料欄。

無法對生成資料欄授予「UPDATE」。

GRANT UPDATE 的使用範例

GoogleSQL

GRANT UPDATE ON TABLE employees, contractors TO ROLE hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT UPDATE ON TABLE employees, contractors TO hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO hr_rep;

DELETE

允許角色從指定資料表刪除資料列。

  • 無法在資料欄層級授予DELETE。

  • 此外,對於可能包含在查詢 WHERE 子句中的任何資料欄,該角色也需要 SELECT。

  • 如果是 GoogleSQL 方言資料庫中的交錯資料表,則只需具備父項資料表的 DELETE 權限。如果子資料表指定 ON DELETE CASCADE,即使沒有子資料表的 DELETE 權限,系統也會刪除子資料表中的資料列。

使用 GRANT DELETE 的範例

GoogleSQL

GRANT DELETE ON TABLE employees, contractors TO ROLE hr_admin;

PostgreSQL

GRANT DELETE ON TABLE employees, contractors TO hr_admin;

EXECUTE

授予變更串流的 SELECT 時,也必須授予變更串流讀取函式的 EXECUTE。詳情請參閱「變更串流讀取函式和查詢語法」。

與模型搭配使用時,這個角色可在機器學習函式中使用模型。

使用 GRANT EXECUTE 的範例

以下範例說明如何為名為 my_change_stream 的變更串流,授予讀取函式的 EXECUTE。

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION READ_my_change_stream TO ROLE hr_analyst;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.read_json_my_change_stream TO hr_analyst;

用量

將 USAGE 授予具名結構定義後,即可存取該結構定義中的物件。根據預設,系統會將 USAGE 權限授予預設結構定義。

後續步驟