このトピックでは、CREATE VIEW
ステートメントを実行してビューを作成する方法について説明します。
使用上の注意
AnalyticDB for MySQLとMySQL間のビューの互換性:
3.1.9.0より前のバージョン
AnalyticDB for MySQLはMySQLのデフォルト動作と互換性がありません。 ビューに列が追加または削除された場合、システムは
SELECT * from <view_name>;
ステートメントの応答から列数の変更を識別し、ビューを使用できないと判断し、次のエラーを報告します。view '<view_name>' is stale; it must be recreated
.V3.1.9.0以降
AnalyticDB for MySQLは、MySQLのデフォルト動作と互換性があります。 CREATE VIEWステートメントを使用してビューを作成すると、AnalyticDB for MySQLは、ステートメント内のアスタリスク (
*
) を解析した後のステートメントを特定の列に保存します。 この場合、列を追加または削除するときにエラーは発生しません。
予期しないエラーを防ぐため、V3.1.9.0以降のAnalyticDB for MySQLクラスターを使用することを推奨します。 CREATE VIEWステートメントでは、特定の列名を使用することを推奨しますが、アスタリスク (*
) は使用しないことを推奨します。
クラスターのマイナーバージョンをクエリする方法については、AnalyticDB for MySQLクラスターのバージョンを照会するにはどうすればよいですか? クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。
V3.1.9.0以降のAnalyticDB for MySQLクラスターとMySQLの動作との互換性は、特別な影響を与える可能性があります。 たとえば、列Cの名前を列Dに変更すると、列A、列B、および列C
を参照しているときに列Cが見つからず、エラーが報告されます。 これは、SQL構文のチェックと認証が実行される解析ステージが、列が削除される最適化ステージよりも早いため、期待される結果です。 列Cがクエリに使用されているかどうかに関係なく、解析段階でエラーが報告されます。 3.1.9.0より前のバージョンのAnalyticDB for MySQLでは、ビュー内の列数がアスタリスク (*
) で参照されている列数と同じかどうかのみがチェックされます。 この場合、エラーは報告されず、システムは列Cをベーステーブルの3番目の列にマッピングします。 RENAME操作後に列Cをクエリしても、エラーは報告されません。 これは予想外の結果である。
3.1.9.0より前のバージョンのAnalyticDB for MySQLクラスターの特別な動作との互換性が必要な場合は、CREATE VIEWステートメントにヒントを追加するか、特定のグローバルパラメーターを設定できます。
1つのビューのCREATE VIEWステートメントに、
/* + LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false */
のヒントを追加します。 例:/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/ CREATE VIEW v0 AS SELECT * FROM base0;
すべてのビューに必要な設定を適用するには、次のグローバルパラメーターを設定します。
SET ADB_CONFIG LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE = false;
構文
CREATE
[OR REPLACE]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name
AS select_statement;
オプション | 必須 | 説明 |
| 任意 | 既存のビューが同じ名前を使用するかどうかに基づいてビューを作成します。 次のルールが適用されます。
説明 このオプションを指定しない場合、既存のビューが同じ名前を使用している場合、ビューは作成できません。 |
| ビューからデータを照会するときのセキュリティ認証の方法を定義します。 有効な値:
説明
| |
| 可 | ビューの名前。 説明 ビューに名前を付けるときに、ビューの名前の前にビューを含むデータベースの名前を追加することもできます。 例: |
| ビューのデータソース。 |
例
データの準備
AnalyticDB for MySQLクラスターの特権アカウントを使用して、次の操作を実行します。
user1
という名前のアカウントを作成します。CREATE USER user1 IDENTIFIED BY 'user1_pwd';
adb_demo
という名前の既存のデータベースにt1
という名前のテーブルを作成します。Create Table `t1` ( `id` bigint AUTO_INCREMENT, `id_province` bigint NOT NULL, `user_info` varchar, primary key (`id`) ) DISTRIBUTE BY HASH(`id`);
テストデータを
t1
テーブルに挿入します。INSERT INTO t1(id_province,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
ビューの作成
説明次の例は、ビューを作成するときに異なる認証方法を指定する方法を示しています。 ビューのデータは
t1
テーブルから取得されます。SQLセキュリティ
をINVOKER
に設定して、v1
という名前のビューを作成します。CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
SQLセキュリティ
をDEFINER
に設定して、v2
という名前のビューを作成します。CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
v3
という名前のビューを作成し、SQL SECURITY
オプションを指定しないでください。 この場合、INVOKER
認証方式が使用されます。CREATE VIEW v3 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
アクセス許可の比較
特権アカウントを使用して、
user1
アカウントに3つのビューを照会する権限を付与します。GRANT SELECT ON adb_demo.v1 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v2 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v3 TO 'user1'@'%';
この場合、
user1
アカウントを使用してAnalyticDB for MySQLクラスターのadb_demo
データベースに接続した後、user1
アカウントを使用してv2
ビューからのみデータを照会できます。SELECT * FROM v2
次の応答が返されます。
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+
SELECTステートメントを使用して
v1
またはv3
ビューからデータをクエリすると、エラーが返されます。SELECT * FROM v1
または
SELECT * FROM v3
前述のSELECTステートメントのいずれかを実行すると、次のエラーメッセージが返されます。
ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Failed analyzing stored view
user1
アカウントに3つのビューを照会する権限が付与されたら、特権アカウントを使用してuser1
アカウントにt1
テーブルを照会する権限を付与します。GRANT SELECT ON adb_demo.t1 to user1@'%';
この場合、
user1
アカウントを使用してAnalyticDB for MySQLクラスターのadb_demo
データベースに接続した後、user1
アカウントを使用してv1
、v2
、およびv3
ビューのデータを照会できます。SELECT * FROM v1
または
SELECT * FROM v2
または
SELECT * FROM v3
上記のSELECTステートメントのいずれかを実行すると、次の結果が返されます。
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+
ベストプラクティス
詳細については、「ビューを使用した権限管理」をご参照ください。