ビュー(更新可能なビューを含む) はMySQL Server 5.1から入手可能。
旧バージョンMySQLを5.1にアップグレードした場合、ビューの使用はビュー関連の
権限を含むようにグラントテーブルもアップグレードが必要です。

———————————
メモ
———————————
mysql_upgrade コマンドは、古い方、つまり mysql_fix_privilege_tables より優先です。
MySQL 5.1.7 では、シェル スクリプト として mysql_upgrade が加えられ、Unix システムだけで機能します。
MySQL 5.1.10 以降は、mysql_upgrade は実行可能なバイナリとして、すべてのシステムで使用できます。
mysql_upgrade をサポートしているものより古いシステムでは、手動で mysqlcheck コマンドを実行し、
システム テーブルのアップグレードを行ないます

ビューの現在の実装には欠点があります。もしユーザがビューの作成に必要な基本権限
( CREATE VIEW と SELECT 権限 ) を取得した場合、SHOW VIEW 権限も取得しない限り、
そのユーザはオブジェクトの SHOW CREATE VIEW を呼び出すことはできない。

PREPARE によって準備されたステートメントがビューを参照する場合、後でステートメントが実行される度
に参照されるビューの内容が、ステートメントが準備できた時のビューの内容になります。
これは、ステートメントが準備された後、実行される前にビュー定義が変更されても同じ。


CREATE VIEW v AS SELECT 1;
PREPARE s FROM 'SELECT * FROM v';
ALTER VIEW v AS SELECT 2;
EXECUTE s;

view11

幾つかのビューは更新可能です。すなわち、基礎をなすテーブルの内容を更新するため、
UPDATE、DELETEもしくはINSERTのようなステートメントの中でそれらを使うことができます。
ビューを更新可能にするため、ビュー中の行と基礎テーブル中の行の間に1対1の関係が存在しなければなりません。
ビューを更新不能にするその他の生成子もあります。もっと具体的に言うと、それが以下のいずれかを含んでいると
ビューは更新可能となりません。

* 集約ファンクション(SUM()、 MIN()、 MAX()、COUNT()等)
* DISTINCT
* GROUP BY
* HAVING
* UNION もしくはUNION ALL
* 選択リスト中のサブ・クエリ
* 特定結合(このセクション中の後の部分に追加した結合の説明参照)
* FROM節中の更新不能ビュー
* FROM節中のテーブルを参照するWHERE 節中のサブ・クエリ
* 文字値だけを参照(この場合、更新する基礎となるテーブルは存在しません)
* ALGORITHM = TEMPTABLE (テンポラリテーブルの使用は常にビューを更新不能にする)

(INSERTステートメントで更新不能となる)挿入性に関して、それがビューカラムに対する
これらの追加条件も満たすと、更新不能ビューが挿入可能になります。

* ビューカラム名に重複があってはなりません。
* ビューには、デフォルト値を持っていないベーステーブル内にある全てのカラムを含んでいなくてはなりません。
* ビューカラムは派生カラムではなく、単純なカラムリファレンスでなければなりません。
派生カラムは単純なカラムリファレンスでなく、表現から派生したものです。これらは派生カラムの例です。

3.14159
col1 + 3
UPPER(col2)
col3 / col4
(subquery)

UPDATE,INSERTが可能か確認検証


CREATE VIEW V_Region (CityName, CountryName)
AS SELECT City.Name, Country.Name FROM City, Country
WHERE City.CountryCode = Country.Code
AND City.CountryCode = 'DEU';

VIEW
create_view

    UPDATE確認


update V_Region set CityName = 'HAMBURG'
where CityName = 'Hamburg';

1つのテーブルしか更新されないのでエラーにはならない。
view_update

複数テーブルを更新しようとするとUPDATEもエラーになる

update V_Region set
CityName = 'Hamburg',
CountryName = 'Japan'
where CityName = 'HAMBURG';

複数テーブルを更新しようとしているのでエラーになる
view_update_multi

    INSERT確認

insert into V_Region(CityName,CountryName) values('NewCity','Japan');

※ 複数のテーブルを更新することになるのでエラーになる。
view_insert1

参考サイト
20.2. CREATE VIEW 構文


D.4. ビューの規制


4.5.4. mysql_upgrade — MySQL アップグレードのテーブル チェック

Comments are closed.

Post Navigation