メインコンテンツまでスキップ

権限を管理する

備考

プレビュー

この機能は、us-east-1us-west-2eu-west-1ap-southeast-1ap-southeast-2eu-central-1us-east-2ap-south-1のリージョンでパブリック プレビューとして提供されています。

Lakebase プロビジョニング プレビューは、手動でスケールするプロビジョニング コンピュートを使用します。 オートスケール コンピュート、分岐、即時復元、その他の高度な機能をサポートする Lakebase の新しいバージョンについては、 「Lakebase Postgres (オートスケール プレビュー)」を参照してください。 どのバージョンが適しているかを判断するには、バージョンの選択を参照してください。

このページでは、データベース インスタンスに対する Databricks ユーザーと ID のアクセス許可を付与するタイミングと方法について説明します。

他のユーザーがPostgreSQLを使用してデータベース・インスタンスにアクセスできるようにするには、 databricks_superuser は対応するPostgresロールを作成する必要があります。Postgres ロールの作成方法の詳細については、「 Postgres ロールの管理」を参照してください。

アクセス許可がチェックされるタイミングと方法

Postgres 構文を使用するか、PostgreSQL インターフェイスを介して接続する場合、Lakebase は以下を使用して PostgreSQL 固有のアクセス制御を適用します。

  • Postgres ロール
  • ロール メンバーシップ
  • Postgres で付与されたアクセス許可

他のすべてのシナリオでは、Lakebase は Databricks 固有のアクセス制御を適用します。

  • Databricks ID(ユーザー、グループ、サービスプリンシパル)
  • Databricks グループ メンバーシップ
  • ワークスペースアクセス制御リスト (ACL)
  • Unity Catalog の特権
注記

Databricks ID とメンバーシップ、および Postgres ロールとメンバーシップの間には自動同期はありません。

ユースケース/権限またはID

データベースインスタンスの管理

同期されたテーブルを作成または削除する

同期されたテーブル パイプラインを管理する

SQLウェアハウスからPostgresテーブルのクエリー

特徴量およびモデルサービングにおけるオンライン特徴量のクエリ

PostgreSQL での Postgres テーブルのクエリ

Databricks ID

対応するPostgresロールが必要です

Databricks グループ メンバーシップ

グループでログインするときにのみログイン時にチェックされます

インスタンス ACL

パイプライン ACL

既存のパイプラインを再利用する場合、または同期されたテーブルを削除する場合 (パイプラインを編集する) 場合は、パイプライン所有者である必要があります

UC 権限

Postgres ロール

Postgres ロール メンバーシップ

Postgres の権限

データベースインスタンスの権限

インスタンスを管理し、Databricks UI、API、または SDK からテーブル操作を実行するには、ユーザーがデータベース インスタンスに対する特定の権限を持っている必要があります。ワークスペース管理者とインスタンス作成者は、 データベース インスタンスの 概要ページで、任意のユーザー、グループ、またはサービスプリンシパルに追加の権限を割り当てることができます。

  1. ワークスペースのサイドバーで「 コンピュート 」をクリックします。
  2. [ OLTP データベース] をクリックします。
  3. アクセス許可 」タブをクリックします。
  4. 右上の インスタンスのアクセス許可を管理 をクリックします。
  5. 追加の権限を付与するユーザー、グループ、またはサービスプリンシパルを入力します。
  6. ID に付与するアクセス許可を選択します。データベース・インスタンス ACLを参照してください。
  7. [ + 追加 ] をクリックします。
  8. すべてのワークスペース・ユーザーは、データベース・インスタンスを表示またはリストできます。データベース カタログと同期テーブルの権限は、Unity Catalogのメタストア、カタログ、スキーマ、およびテーブルの権限によってさらに管理されます 。 詳細については、「 Unity Catalog での特権の管理」を参照してください。
  9. 保存 をクリックします。

Postgresの権限

Postgres のテーブルを読み取ったり、テーブルに書き込んだりするには、ユーザーには Postgres での次の権限が必要です。

  • CONNECT データベース上
  • USAGE スキーマ(または新しいテーブルを作成する場合はCREATE
  • SELECTINSERTUPDATE 、またはDELETEテーブル上にあります

Postgres 権限の完全なリストについては、 PostgreSQL のドキュメントを参照してください。

Postgres の特定のテーブルに対するユーザー権限を確認する

次の SQL ステートメントを実行して、継承された権限を含むユーザーの権限をチェックするpg_temp.check_permissionsという名前の関数を作成します。

SQL
CREATE OR REPLACE FUNCTION pg_temp.check_permissions(TEXT, TEXT, TEXT, TEXT)
RETURNS TABLE(database_connect BOOLEAN, schema_usage BOOLEAN, table_select BOOLEAN,
table_insert BOOLEAN, table_update BOOLEAN, table_delete BOOLEAN) AS $$
SELECT
has_database_privilege($1, $2, 'CONNECT'),
has_schema_privilege($1, $3, 'USAGE'),
has_table_privilege($1, $4, 'SELECT'),
has_table_privilege($1, $4, 'INSERT'),
has_table_privilege($1, $4, 'UPDATE'),
has_table_privilege($1, $4, 'DELETE')
$$ LANGUAGE sql
;

この関数を使用するには、次のクエリを使用します。

SQL
SELECT * FROM pg_temp.check_permissions('<your_user>', '<your_database>', '<your_schema>', '<your_table>');

-- Example:
SELECT * FROM pg_temp.check_permissions('joe@acme.org', 'databricks_postgres', 'public', 'table1');

Postgres のデータベース、スキーマ、テーブルのすべての権限を表示します

次の SQL ステートメントは、継承された権限を除く、すべてのユーザーに付与されたすべての権限の詳細ビューを返すpg_temp.make_owner_aclという名前の関数を作成します。

SQL
CREATE OR REPLACE FUNCTION pg_temp.make_owner_acl(owner_oid OID)
RETURNS TABLE(grantor OID, grantee OID, privilege_type TEXT, is_grantable BOOLEAN) AS $$
SELECT owner_oid, owner_oid,'OWNER'::TEXT, True
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION pg_temp.get_all_permissions(TEXT, TEXT, TEXT)
RETURNS TABLE(type TEXT, name TEXT, role TEXT, acl TEXT, can_grant TEXT) AS $$
SELECT type, name,
CASE WHEN grantee = 0 THEN 'PUBLIC' ELSE pg_get_userbyid(grantee) END AS role, privilege_type,
CASE WHEN privilege_type = 'OWNER' THEN 'YES, ALL' WHEN is_grantable THEN 'YES' ELSE 'NO' END AS can_grant
FROM (
SELECT 'DATABASE' type, datname as name, (pg_temp.make_owner_acl(datdba)).*
FROM pg_database
WHERE datname = $1
UNION ALL
SELECT 'DATABASE' type, datname as name, (aclexplode(datacl)).*
FROM pg_database
WHERE datname = $1
UNION ALL
SELECT 'SCHEMA' type, nspname as name, (pg_temp.make_owner_acl(nspowner)).*
FROM pg_namespace
WHERE nspname = $2
UNION ALL
SELECT 'SCHEMA' type, nspname as name, (aclexplode(nspacl)).*
FROM pg_namespace
WHERE nspname = $2
UNION ALL
SELECT 'TABLE' type, relname as name, (pg_temp.make_owner_acl(relowner)).*
FROM pg_class
WHERE relname = $3
UNION ALL
SELECT 'TABLE' type, relname as name, (aclexplode(relacl)).*
FROM pg_class
WHERE relname = $3
)
$$ LANGUAGE SQL
;

この関数を使用するには、次のクエリを使用します。

SQL
SELECT * FROM pg_temp.get_all_permissions('<your_database>', '<your_schema>', '<your_table>');

-- Example:
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', 'table1');

Postgresのロール継承階層を確認する

Postgres では、ロールは別のロールのメンバーになることができ、メンバーシップによって権限が親ロールから継承されるかどうかが指定されます。特定のロールが属するすべてのロールを表示するには、次の SQL ステートメントを使用して SQL 関数pg_temp.get_inherited_rolesを作成します。

SQL
CREATE OR REPLACE FUNCTION pg_temp.get_inherited_roles(
role_name TEXT
)
RETURNS TABLE(inherited_roles TEXT, member_via TEXT, inherits_permissions TEXT) AS $$
WITH RECURSIVE role_tree AS (
SELECT
m.roleid,
pg_get_userbyid(m.roleid) rolname,
'DIRECT' COLLATE "C" as member_via,
m.inherit_option as inherits_permissions
FROM pg_auth_members m
WHERE m.member = (SELECT oid FROM pg_roles WHERE rolname = $1)
UNION ALL
SELECT
m.roleid,
pg_get_userbyid(m.roleid) rolname,
rt.rolname::text as member_via,
(rt.inherits_permissions AND m.inherit_option) as inherits_permissions
FROM pg_auth_members m
JOIN role_tree rt ON m.member = rt.roleid
)
SELECT
rolname AS inherited_roles,
member_via,
CASE WHEN inherits_permissions THEN 'YES' ELSE 'NO' END as inherits_permissions
FROM role_tree
GROUP BY inherited_roles, member_via, inherits_permissions
ORDER BY inherits_permissions DESC
$$ LANGUAGE sql
;

この関数を使用するには、 <your_user>を Databricks ユーザー名に置き換えます。

SQL
SELECT * FROM pg_temp.get_inherited_roles('<your role>');

Postgresでロール管理者を見つける

ロールの管理者を確認するには、次の SQL クエリを使用して、 <target_role>をロール名に置き換えます。

SQL
SELECT pg_get_userbyid(m.member) admin
FROM pg_auth_members m
WHERE m.roleid = (SELECT oid FROM pg_roles WHERE rolname = '<target_role>')
AND m.admin_option = true;