例: SQL SECURITY—DEFINERの指定 - Teradata Database - Teradata Vantage NewSQL Engine - 例: SQL SECURITY—DEFINERの指定、CREATE PROCEDURE (SQL形式)およびREPLACE PROCEDURE (SQL形式)のSQL文

Teradata Vantage™ 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/wkf1512081455740.ditamap
dita:ditavalPath
ja-JP/wkf1512081455740.ditaval
dita:id
B035-1144
Product Category
Software
Teradata Vantage

DEFINERオプションはSQL SECURITY句のデフォルトです。

DEFINERオプションには、次のルールが適用されます。
  • Teradata Databaseは、コンパイル時および実行時に、プロシージャの作成者と所有者の両方の権限をチェックします。
  • 作成者と所有者が異なる場合でも、プロシージャ定義では静的なDDL文とDML文が有効です。

    プロシージャ本体内のすべての非修飾オブジェクトの参照を暗黙のうちに修飾するため、Teradata Databaseはデフォルトとして作成者(定義者)のユーザーの名前を使用します。

次に、静的SQLのDEFINERの場合の例を示します。この例では、user_1がSYSLIBデータベースにプロシージャdyn_dmlを作成し、user_2がSYSLIB.dyn_dmlを呼び出しています。

この例では、Teradata Databaseは次の権限を検証します。

事例 Teradata Databaseが検証する権限とその意味
コンパイル user_1には、SYSLIBデータベースに対するCREATE PROCEDURE権限があります。

user_1には、データベース オブジェクトuser_1.t1user_1に対するINSERT権限があります。

SYSLIBデータベースには、データベース オブジェクトuser_1.t1に対するINSERT権限があります。

実行 user_2には、SQLプロシージャSYSLIB.dyn_dmlに対するEXECUTE PROCEDURE権限があります。

user_1には、データベース オブジェクトuser_1.t1に対するINSERT権限があります。

SYSLIBデータベースには、データベース オブジェクトuser_1.t1に対するINSERT権限があります。

     .LOGON user_1,user_1
     .COMPILE FILE sp.spl
     /* sp.spl file
     CREATE PROCEDURE SYSLIB.static_dml()
     SQL SECURITY DEFINER
     BEGIN
       INSERT INTO t1
       SELECT 1,1;
     END;
     /*
     .LOGON user_2,user_2
     CALL SYSLIB.static_dml();

動的SQLの場合、Teradata Databaseは次の権限を検証します。

事例 Teradata Databaseが検証する権限とその意味
コンパイル user_1には、SYSLIBデータベースに対するCREATE PROCEDURE権限があります。
実行 user_2には、SQLプロシージャSYSLIB.dyn_dmlに対するEXECUTE PROCEDURE権限があります。

user_1には、データベース オブジェクトuser_1.t1に対するINSERT権限があります。

SYSLIBデータベースには、データベース オブジェクトuser_1.t1に対するINSERT権限があります。

     .LOGON user_1/user_1
     .COMPILE FILE sp.spl
     /* sp.spl file
     CREATE PROCEDURE SYSLIB.dyn_dml()
     SQL SECURITY DEFINER
     BEGIN
       CALL dbc."sysexecsql" ('INSERT INTO t1 (1,1);');
     END;
     /*
     .LOGON user_2/user_2
     CALL SYSLIB.dyn_dml();