ストアド プロシージャでのSQL文の使用に関するルール - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQL ストアド プロシージャおよび埋め込みSQL

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/rop1530578142648.ditamap
dita:ditavalPath
ja-JP/rop1530578142648.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

静的および動的なSQL文、制御文、条件ハンドラー、カーソル宣言、条件宣言、およびローカル宣言文を含むあらゆる文をストアド プロシージャで使用する際に適用されるルールは、SQL SECURITY句で指定されたオプションによって異なります。

ストアド プロシージャ内での文の使用に対して、以下のルールが適用されます。

ストアド プロシージャ内に指定されたいずれかのSQL文が欠落したデータベース オブジェクトを参照していて、SQL SECURITY句がCREATOR、OWNER、またはINVOKERである場合、そのプロシージャの作成時にSPLコンパイル警告が出される。

ストアド プロシージャ内に指定されたいずれかのSQL文が、欠落したデータベース オブジェクトを参照していて、SQL SECURITY句がDEFINERである場合、
  • 作成者と所有者が同じであれば、そのストアド プロシージャの作成時にSPLコンパイル警告が出力される。
  • 作成者と所有者が同じでなければ、エラーが報告され、そのストアド プロシージャは作成されない。

参照されているオブジェクトが、ストアド プロシージャの実行時に存在しないと、実行時例外が報告される。

欠落したデータベース オブジェクトをカーソルのSELECT文が参照すると、SPLコンパイル エラーが出力される。

SQL文によってストアド プロシージャ本体内に作成されたオブジェクトがすでに存在する場合や、別のスキーマのもとに存在する場合、SPLコンパイル警告が出力される。

ストアド プロシージャで参照されるオブジェクトに対してユーザーが必要な権限を持っていない場合、ストアド プロシージャの作成時に該当する警告またはエラーが出力される。Teradata Databaseは、SQL SECURITY句の定義に基づいて権限をチェックします。

要求された権限がストアド プロシージャの実行時に存在しないと、実行時例外が報告される。

カーソルのSELECT文内で参照されているオブジェクトに対して必要な権限を作成者がもっていないと、SPLコンパイル エラーが報告される。

ストアド プロシージャで作成されたオブジェクトの所有権

  • ストアド プロシージャの直接所有者は、そのストアド プロシージャを使用して作成された永続オブジェクトの作成者です。たとえプロキシ接続経由でTeradata Databaseにアクセスしている場合でも、このようになります。揮発性テーブルは、永続オブジェクトではないので、例外になります。

    それ以外のユーザーがそのストアド プロシージャを実行しても、新しく作成されたオブジェクトに対する自動的な権限を与えられません。直接所有者は、新規に作成したオブジェクトに対する権限を、他のユーザーに対して明示的に付与することができます。

  • SQL文内のデータベース オブジェクトをデータベース名で明示的に修飾しないと、デフォルト データベースが使われて、オブジェクト名が暗黙で修飾されます。

    DDL文を使ってデータベース オブジェクトを作成する場合は、修飾する側のデータベース(暗黙または明示的のどちらかで)が、作成されるそのオブジェクトの直接所有者になります。

SQL文エラー

ストアド プロシージャ本体内の何らかの文によってエラーや警告が発生すると、次のような影響が生じます。
文で発生したエラーや警告 結果
構文エラー
  • コンパイル エラーが報告される。
  • プロシージャは作成されない。
複数のエラー その文に関して、最初のエラーだけが報告される。
複数の警告 その文に関して、最初の警告だけが報告される。
エラーと警告 その文に関して、最初のエラーだけが報告される。
コンパイルに関する警告(エラーはなし) 警告とともにストアド プロシージャが作成される。

SQL文内の未修飾オブジェクト

ストアド プロシージャの実行時には、いずれかのDML文中で参照されているのにデータベース名で明示的に修飾されていないデータベース オブジェクトに対して、以下のようなルールが適用されます。
  • 未修飾のテーブル参照の場合、ストアド プロシージャのデフォルト データベースがデフォルトになります。デフォルト データベースは、SQL SECURITYオプションによって異なります。
条件 結果
コンパイル時のデフォルト データベース内にそのテーブルは存在しない ユーザーのログイン データベース内から、同じ名前の付いた揮発性のテーブルが検索されます。
  • 揮発性のテーブルが存在する場合、それに対するアクセスが行なわれます。
  • 揮発性のテーブルが存在しない場合、実行時例外3807 (Table/view/trigger/procedure does not exist)が発生します。
参照されているテーブルはデフォルト データベース内に存在する 同じ名前の付いた揮発性のテーブルがユーザーのログイン データベース内に存在しない場合は、テーブルへのアクセスが行なわれます。
同じ名前の付いた揮発性のテーブルがユーザーのログイン データベース内にも存在する場合、実行時例外3806 (Table/view/trigger name is ambiguous)が発生します。
  • 揮発性になる可能性のあるテーブルに対する参照も含め、ストアド プロシージャ本体内に指定された文中で参照されている未修飾のデータベース オブジェクトはすべて、現在のデフォルト データベースから検証されます。

関連トピック

SQL SECURITYの詳細については、ストアド プロシージャの権限チェックを参照してください。