DEFINERオプションはSQL SECURITY句のデフォルトです。
DEFINERオプションには、次のルールが適用されます。
- Vantageは、コンパイル時および実行時に、プロシージャの作成者と所有者の両方の権限をチェックします。
- 作成者と所有者が異なる場合でも、プロシージャ定義では静的なDDL文とDML文が有効です。
プロシージャ本体内のすべての非修飾オブジェクトの参照を暗黙のうちに修飾するため、Vantageはデフォルトとして作成者(定義者)のユーザーの名前を使用します。
次に、静的SQLのDEFINERの場合の例を示します。この例では、user_1がSYSLIBデータベースにプロシージャdyn_dmlを作成し、user_2がSYSLIB.dyn_dmlを呼び出しています。
この例では、Vantageは次の権限を検証します。
事例 | Vantageが検証する権限とその意味 |
---|---|
コンパイル | user_1には、SYSLIBデータベースに対するCREATE PROCEDURE権限があります。 user_1には、データベース オブジェクトuser_1.t1のuser_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の場合、Vantageは次の権限を検証します。
事例 | Vantageが検証する権限とその意味 |
---|---|
コンパイル | 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();