17.05 - 例: SQL SECURITY—INVOKERの指定 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-175K-JPN
Language
日本語 (日本)

INVOKERロジックは、現在最上位にある許可スタックを使用して権限をチェックします。また、スタックの最上位にある許可識別子は、プロシージャのSQL文内で修飾されていないすべてのオブジェクト参照の暗黙的修飾用のデフォルトの修飾子として使用されます。SQL SECURITY INVOKERを指定する場合、Vantageはスタックの最上位にある権限を使用します。

静的SQL

静的SQLの場合、Vantageはプロシージャの作成時にプロシージャを呼び出したユーザーの権限をチェックします。

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

参照されるオブジェクトに対して作成者に必要な権限。ただし、警告のみが生成され、ストアド プロシージャの作成は可能です。

実行

呼び出し元のEXECUTE PROCEDURE権限。

参照されるオブジェクトに対して呼び出し元に必要な権限。権限がない場合、実行は失敗します。

例えば、DBCユーザーは次のようにデータベース、テーブル、ユーザーを作成します。

     CREATE DATABASE db1 AS PERM = 1e6;
     CREATE DATABASE db2 AS PERM = 1e6;

     CREATE TABLE db1.tab1(a INT, b INT);
     CREATE TABLE db2.tab1(a INT, b INT);

     CREATE DATABASE testdb1 AS PERM = 1e6;

     CREATE USER User1 AS PERM = 1e6 PASSWORD = User1;

     GRANT CREATE PROCEDURE ON testdb1 TO User1;
     GRANT EXECUTE PROCEDURE ON testdb1 TO User1;
次のように、テキスト エディタを使用してストアド プロシージャを作成します。
     sp1.spl
     -------
     REPLACE PROCEDURE testdb1.sp1() 
     SQL SECURITY INVOKER 
     BEGIN 
     delete from db1.tab1; 
     insert into db1.tab1 select * from  db2.tab1;
     END;

次に、User1は、ストアド プロシージャをコンパイルします。次のような警告とともにストアド プロシージャが正常に作成されます。

     .compile file = sp1.spl

     *** Procedure has been created. 2 Errors/Warnings. 
     *** Warning: 5527 Stored Procedure Created with Warnings.
     *** Total elapsed time was 1 second.

     Warnings reported during compilation
     ------------------------------------
     SPL5000:W(L4), E(3523):The user does not have DELETE access to db1.tab1.
     SPL5000:W(L5), E(3523):The user does not have SELECT access to db2.tab1.

SHOW PROCEDURE文を使用して、プロシージャの作成を検証します。

SHOW PROCEDURE testdb1.sp1;

 *** Text of DDL statement returned. 
 *** Total elapsed time was 1 second.

----------------------------------------------
REPLACE PROCEDURE testdb1.sp1() 
SQL SECURITY INVOKER 
BEGIN 
delete from db1.tab1; 
insert into db1.tab1 select * from  db2.tab1;
END;

INVOKERの権限が実行時にチェックされ、必要な権限がない場合は失敗します。

Call testdb1.sp1();
 *** Failure 3523 SP1:The user does not have DELETE access to db1.tab1.
 *** Total elapsed time was 1 second.

動的SQL

動的SQLの場合、プロシージャの作成時にチェックされる権限はありません。Vantageは、オブジェクトが存在しない場合にのみ、警告メッセージを生成します。システムは、プロシージャの実行時にすべての権限をチェックします。

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

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

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

user_2には、テーブルuser_2.t1に対するINSERT権限があります。

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