Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ SQL の使用法 » ストアドプロシージャ、トリガ、バッチ、ユーザ定義関数 » プロシージャ

 

プロシージャとファンクションを設定し所有者または呼び出し側の権限で実行する

プロシージャまたはファンクションを指定する場合、プロシージャまたはファンクションをその「所有者」の権限で実行するか、またはそれを呼び出したユーザまたはプロシージャ (「呼び出し側」) の権限で実行するかを指定できます。呼び出し側の特定は常に明白であるとはかぎりません。ユーザがプロシージャを呼び出すこともできますが、プロシージャが別のプロシージャを呼び出すこともできます。このような場合、「ログインユーザ」 (トップレベルのプロシージャを最初に呼び出したユーザ) と、最初のプロシージャによって呼び出されたプロシージャの所有者の場合もある「有効なユーザ」とは区別されます。プロシージャが呼び出し側の権限で実行される場合、有効なユーザの権限が適用されます。

プロシージャまたはファンクションを作成する場合、CREATE PROCEDURE 文または CREATE FUNCTION 文の SQL SECURITY 句により、プロシージャまたはファンクションを実行するときに適用される権限が、修飾されていないオブジェクトの所有者とともに設定されます。この句では、INVOKER または DEFINER が選択されます。ただし、ユーザは別のユーザが所有するプロシージャまたはファンクションを作成することができます。この場合は、実際は定義者ではなく所有者の権限となります。

プロシージャまたはファンクションを作成するときに、すべてのオブジェクト名 (テーブル、プロシージャなど) を該当する所有者で修飾する場合は注意が必要です。プロシージャ内のオブジェクトが所有者に対して修飾されていない場合、そのオブジェクトが所有者として実行されるか呼び出し側として実行されるかにより、所有者が異なります。たとえば、user1 が次のプロシージャを作成するとします。

CREATE PROCEDURE user1.myProcedure()
   RESULT( columnA INT )
   「SQL SECURITY INVOKER」
   BEGIN
     SELECT columnA FROM table1;
   END;

別のユーザである user2 がこのプロシージャの実行を試行したときに user2.table1 が存在しない場合は、エラーが返されます。user1.table1 ではなく user2.table1 が存在する場合は、それが使用されます。

呼び出し側の権限を使用してプロシージャまたはファンクションを実行する場合、呼び出し側はプロシージャ、ファンクションまたはシステムプロシージャが動作するデータベースオブジェクトに必要な権限に加えて、そのプロシージャの EXECUTE 権限を持っている必要があります。

プロシージャまたはファンクションを呼び出し側として実行するのか定義者として実行するのかわからない場合は、その SQL 定義で SQL SECURITY 句を参照します。

データベースで権限付き操作を実行するプロシージャまたはファンクションに必要な権限を決定する場合は、sp_proc_priv システムプロシージャを使用します。sp_proc_priv システムプロシージャを参照してください。

 参照

16.0 より前のバージョンのシステムプロシージャを呼び出し側または定義者として実行する