このトピックでは、異なるアカウントに対応する権限を付与して、同じテーブル内の異なるデータをクエリする方法について説明します。
シナリオと要件
異なる州の顧客を含むcustomerという名前のテーブルが作成されます。 サンプル文:
Create Table `customer` (
`id` bigint AUTO_INCREMENT,
`province_id` bigint NOT NULL,
`user_info` varchar,
primary key (`id`)
) DISTRIBUTE BY HASH(`id`);テストデータが顧客テーブルに挿入されます。 サンプルステートメント:
INSERT INTO customer(province_id,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');SELECTステートメントを実行して顧客テーブルのデータを照会すると、次のデータが返されます。
+---------------------+-------------+-----------+
| id | province_id | user_info |
+---------------------+-------------+-----------+
| 1369417242420617216 | 1 | Tom |
| 1369417242424811520 | 1 | Jerry |
| 1369417242424811522 | 3 | Mark |
| 1369417242424811521 | 2 | Jerry |
+---------------------+-------------+-----------+要件は、user1アカウントにProvince 1 (Province e_id=1) のデータを照会する権限を付与し、user2アカウントにProvince 2 (Province e_id=2) のデータを照会する権限を付与することです。
実装方法
上記の要件を満たすには、次の手順を実行します。
次のステートメントを実行して、Province 1の
v1という名前のビューとProvince 2のv2という名前のビューを作成します。次のステートメントを実行して、省1のデータをクエリするv1ビューを作成します。
CREATE SQL SECURITY DEFINER VIEW v1 AS SELECT * FROM customer WHERE province_id=1;次のステートメントを実行して、省2のデータを照会するv2ビューを作成します。
CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT * FROM customer WHERE province_id=2;
説明ビュー作成ステートメントで使用されるパラメーターの詳細については、「CREATE view」をご参照ください。
ビューの作成後、次のステートメントを実行して、対応する権限をアカウントに付与します。
説明アカウントの作成方法については、「ユーザーの作成」をご参照ください。
次のステートメントを実行して、
user1アカウントに、v1ビューを使用してProvince 1のデータを照会する権限を付与します。GRANT SELECT ON v1 TO user1;次のステートメントを実行して、
user2アカウントに、v2ビューを使用してProvince 2のデータを照会する権限を付与します。GRANT SELECT ON v2 TO user2;
結果の検証
user1アカウントを使用してAnalyticDB for MySQLクラスターのadb_demoデータベースに接続する場合、user1アカウントはv1ビューのデータのみを照会できます。 サンプルステートメント:SELECT * FROM v1;上記のステートメントを実行すると、次のデータが返されます。
+---------------------+-------------+-----------+ | ID | PROVINCE_ID | USER_INFO | +---------------------+-------------+-----------+ | 1369417242420617216 | 1 | Tom | | 1369417242424811520 | 1 | Jerry | +---------------------+-------------+-----------+user1アカウントを使用してv2ビューのデータを照会すると、次のエラーメッセージが表示されます。ERROR 1815 (HY000): [9001, 2021083114191719216818804803453965343] : Access Denieduser2アカウントを使用してAnalyticDB for MySQLクラスターのadb_demoデータベースに接続する場合、user2アカウントはv2ビューのデータのみを照会できます。 サンプルステートメント:SELECT * FROM v2;上記のステートメントを実行すると、次のデータが返されます。
+---------------------+-------------+-----------+ | ID | PROVINCE_ID | USER_INFO | +---------------------+-------------+-----------+ | 1369417242424811521 | 2 | Jerry | +---------------------+-------------+-----------+user2アカウントを使用してv1ビューのデータを照会すると、次のエラーメッセージが表示されます。ERROR 1815 (HY000): [9001, 2021083114191719216818804803453965343] : Access Denied