所有権
所有権は、TiDB Cloud Lake 内の特定のデータオブジェクト(現在はデータベース、テーブル、UDF、stage を含む)に対して、あるロールが持つ排他的な権利と責任を示す特別な権限です。
所有権の付与
オブジェクトの所有権は、そのオブジェクトを作成したユーザーのロールに自動的に付与され、GRANT コマンドを使用してロール間で移譲できます。
- オブジェクトの所有権を新しいロールに付与すると、完全な所有権が新しいロールに移譲され、以前のロールからは削除されます。たとえば、最初はロール A がテーブルを所有していて、その所有権をロール B に付与した場合、ロール B が新しい所有者となり、ロール A はそのテーブルに対する所有権を失います。
- セキュリティ上の理由から、組み込みロール
publicに所有権を付与することは推奨されません。ユーザーがpublicロールに属した状態でオブジェクトを作成すると、すべてのユーザーがそのオブジェクトの所有権を持つことになります。これは、各ユーザーがデフォルトでpublicロールを持っているためです。TiDB Cloud Lake では、所有権を明確に管理するために、publicロールを使用する代わりにカスタムロールを作成してユーザーに割り当てることを推奨しています。組み込みロールの詳細については、組み込みロール を参照してください。 defaultデータベース内のテーブルについては、組み込みロールaccount_adminが所有しているため、所有権を付与できません。
所有権の取り消しは不可
すべてのオブジェクトには所有者が必要なため、所有権の取り消しはサポートされていません。
- オブジェクトが削除されると、元のロールによる所有権は保持されません。オブジェクトが復元された場合(可能であれば)も、所有権は自動的には再割り当てされず、
account_adminが手動でロールに所有権を再割り当てする必要があります。 - オブジェクトを所有しているロールが削除された場合、
account_adminはそのオブジェクトの所有権を別のロールに移譲できます。
例
ロールに所有権を付与するには、GRANT コマンドを使用します。以下の例では、異なるデータベースオブジェクトの所有権をロール 'data_owner' に付与する方法を示します。
-- Grant ownership of all tables in the 'finance_data' database to the role 'data_owner'
GRANT OWNERSHIP ON finance_data.* TO ROLE 'data_owner';
-- Grant ownership of the table 'transactions' in the 'finance_data' schema to the role 'data_owner'
GRANT OWNERSHIP ON finance_data.transactions TO ROLE 'data_owner';
-- Grant ownership of the stage 'ingestion_stage' to the role 'data_owner'
GRANT OWNERSHIP ON STAGE ingestion_stage TO ROLE 'data_owner';
-- Grant ownership of the user-defined function 'calculate_profit' to the role 'data_owner'
GRANT OWNERSHIP ON UDF calculate_profit TO ROLE 'data_owner';
次の例は、TiDB Cloud Lake におけるロールベースの所有権の確立を示しています。管理者はロール 'role1' を作成し、それをユーザー 'u1' に割り当てます。'db' スキーマ内でテーブルを作成する権限は 'role1' に付与されます。その結果、'u1' がログインすると 'role1' の権限を持つため、'db' 配下でテーブルを作成して所有できます。一方で、'role1' が所有していないテーブルへのアクセスは制限されており、'db.t_old_exists' に対するクエリが失敗することからもそれが分かります。
-- Admin creates roles and assigns roles to corresponding users
CREATE ROLE role1;
CREATE USER u1 IDENTIFIED BY '123' WITH DEFAULT ROLE 'role1';
GRANT CREATE ON db.* TO ROLE role1;
GRANT ROLE role1 TO u1;
-- After u1 logs into TiDB Cloud Lake, role1 has been granted to u1, so u1 can create and own tables under db:
u1> CREATE TABLE db.t(id INT);
u1> INSERT INTO db.t VALUES(1);
u1> SELECT * FROM db.t;
u1> SELECT * FROM db.t_old_exists; -- Failed because the owner of this table is not role1
次の例は、ユーザーが自分のロールのみに所有されるデータベースを作成できるようにし、明示的にアクセス権が付与されない限り他のユーザーがそれを参照できないようにする方法を示しています。
CREATE ROLE part1_role;
GRANT CREATE DATABASE ON *.* TO ROLE part1_role;
CREATE USER user1 IDENTIFIED BY 'abc123' WITH DEFAULT ROLE 'part1_role';
GRANT ROLE part1_role TO user1;
-- When user1 creates a database, ownership is assigned to part1_role.
-- Other users will not be able to see or access that database unless
-- privileges or ownership are granted to their roles.