無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: D 制限と規制 :: D.4 ビューの規制
« D.3 サブクエリの規制

D.5 XA トランザクションの規制 »
Section Navigation      [Toggle]
  • D 制限と規制
  • D.1 ストアド ルーチンとトリガの規制
  • D.2 サーバサイドカーソルの規制
  • D.3 サブクエリの規制
  • D.4 ビューの規制
  • D.5 XA トランザクションの規制
  • D.6 MySQL の制限

D.4. ビューの規制

ビューの処理は最適化されていません :

  • ビューにインデックスを作成することはできません。

  • 組合せアルゴリズムを使用して処理されたビューに、インデックスを使うことは可能です。しかし、誘導可能なアルゴリズムで処理されたビューは、その背後にあるテーブルのインデックスを活用することができません ( 一時テーブルの作成中にインデックスを使用することはできます ) 。

ビューの FROM 句でサブクエリを使用することはできません。この制限はいずれ取り除かれる予定です。

一般原則として、テーブルを改変したり、サブクエリの同じテーブルから選択することはできません。項D.3. 「サブクエリの規制」 参照。

また、テーブルから選択するビューを選ぶ場合、ビューがサブクエリのテーブルから選択する場合、そして、ビューが組合せアルゴリズムを使って評価される場合、同じ原則が適用されます。例 :

CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a);

UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;

一時テーブルを使ってビューが評価される場合、ビュー サブクエリのテーブルから選択し、さらに外側のクエリのテーブルで改変することが 可能 です。その場合、ビューは一時テーブルに格納されることになり、したがってサブクエリのテーブルから選択し、「同時に」 改変するということにはなりません。(これもまた、ビュー定義で ALGORITHM = TEMPTABLE を指定して、誘導可能なアルゴリズムをMySQL が使用するよう強制できると便利だと考える理由です)。

DROP TABLE または ALTER TABLE を使用して、ビュー定義 ( ビューを無効化するもの ) や削除または変更オペレーションからの無警告結果に使われるテーブルを、削除または変更することができます。エラーは、後でビューが使用された時に発生します。

ビュー定義は特定のステートメントによって「凍結」されています :

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

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

    EXECUTE ステートメントによって返される結果は 2 ではなく、1 です。

  • ストアド ルーチンのステートメントがビューを参照する場合、ステートメントによって参照されたビューの内容は、最初にステートメントが実行された時のその内容です。これは例えば、ステートメントがループで実行された場合、さらなるステートメントの繰り返しが、後でビュー定義がループで変更されたとしても、同じビューの内容を参照するという意味になります。例 :

    CREATE VIEW v AS SELECT 1;
    delimiter //
    CREATE PROCEDURE p ()
    BEGIN
      DECLARE i INT DEFAULT 0;
      WHILE i < 5 DO
        SELECT * FROM v;
        SET i = i + 1;
        ALTER VIEW v AS SELECT 2;
      END WHILE;
    END;
    //
    delimiter ;
    CALL p();
    

    プロシージャ p() が呼び出される際、SELECT は、たとえビュー定義がループ内で変更されても、ループを通るたびに 1 を戻します。

ビューの更新可能性に関しては、すべてのビューが理論的には更新可能ならば、実際に更新可能であるべきだというのがビューに対する全体的な目標です。これには、定義に UNION を含むビューも含まれています。現時点では、理論的には更新可能なすべてのビューが、実際に更新可能というわけではありません。最初のビュー実装は、できるだけ速く MySQL に使用可能で更新可能なビューを提供するため、故意にこのように書かれていました。理論的には更新可能なビューの多くは、今でも更新することができますが、制限はまだ存在します :

  • WHERE 句以外にある、サブクエリを持った更新可能なビュー。SELECT リストにある、サブクエリを持つビューのいくつかは、更新可能な場合がある。

  • UPDATE を使用して、結合として定義されたビューの背後のテーブルをひとつ以上更新することはできない。

  • DELETE を使用して、結合として定義されたビューを更新することはできない。

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

この欠点は、mysqldump を持つデータベースのバックアップの問題につながり、権限の不足のため失敗する原因になる恐れがあります。この問題は バグ #22062 で説明されています。

問題に対する迂回策としては、ビューが作成された時に MySQL が暗黙的にSHOW VIEW 権限を与えないので、管理権限者が手動でその権限を、CREATE VIEW を与えられたユーザに提供することです。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.