ALTER FUNCTION ステートメント

ALTER FUNCTION ステートメントは、既存の関数のプロパティーを変更します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • 関数のスキーマに対する ALTERIN 特権
  • SYSCAT.ROUTINES カタログ・ビューの OWNER 列に記録されているその関数の所有者
  • 関数のスキーマに対する SCHEMAADM 権限
  • DBADM 権限
関数の EXTERNAL NAME を変更するには、ステートメントの許可 ID の特権に、 以下の権限の少なくとも 1 つが含まれている必要があります。
  • データベースに対する CREATE_EXTERNAL_ROUTINE 権限
  • SYSADM 権限
  • DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、値 EXTERNAL_ROUTINE_DBADM が含まれている場合は、DBADM 権限。
fenced でない関数を変更するには、 ステートメントの許可 ID の特権に以下の権限の少なくとも 1 つが含まれている必要があります。
  • データベースに対する CREATE_NOT_FENCED_ROUTINE 権限
  • SYSADM 権限
  • DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、値 EXTERNAL_ROUTINE_DBADM が含まれている場合は、DBADM 権限。

fenced である関数を変更するには、さらに別の権限や特権は必要ありません。

関数を SECURED または NOT SECURED に変更するには、 ステートメントの許可 ID が保持する特権に、以下の権限の少なくとも 1 つが含まれている必要があります。
  • SECADM 権限
  • CREATE_SECURE_OBJECT 権限

他の節を指定しない場合は、 これ以外に、ステートメントを処理するために必要な特権はありません。

注: Db2 11.5.8 セキュリティー特殊ビルド 29133 には、SYSADM 権限と DBADM 権限の両方の暗黙権限に対する変更が含まれています。 デフォルトでは、SYSADM 権限は、DBADM 権限ではなく、暗黙的に権限 CREATE_EXTERNAL_ROUTINE および CREATE_NOT_FENCED_ROUTINE を持ちます。 DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定され、値 EXTERNAL_ROUTINE_DBADM または NOT_FENCED_ROUTINE_DBADM がそれぞれ含まれている場合、DBADM 権限は暗黙的にこれらの特権も持ちます。

構文

Read syntax diagramSkip visual syntax diagramALTERfunction-designator EXTERNAL NAME'string'identifierFENCEDNOT FENCEDSECUREDNOT SECUREDTHREADSAFENOT THREADSAFE
function-designator
Read syntax diagramSkip visual syntax diagramFUNCTIONfunction-name(,data-type)SPECIFIC FUNCTIONspecific-name

説明

関数指定子 (function-designator)
変更される関数を一意的に識別します。 詳しくは、 関数、メソッド、およびプロシージャーの指定子を参照してください。
EXTERNAL NAME 'string' または identifier
関数をインプリメントするユーザー作成コードの名前を指定します。 このオプションは、外部関数を変更する際にのみ指定できます (SQLSTATE 42849)。
FENCED または NOT FENCED
関数をデータベース・マネージャーのオペレーティング環境の プロセスまたはアドレス・スペースで実行しても安全か (NOT FENCED)、 そうでないか (FENCED) を指定します。 多くの関数は、FENCED または NOT FENCED のどちらかで実行するように選択することができます。

関数が FENCED として登録されると、データベース・マネージャーは、 その内部リソース (データ・バッファーなど) を fenced して、その関数からアクセスされないようにします。 一般に、FENCED として実行される関数は、 NOT FENCED として実行されるものと同じようには実行されません。

注意:
適切にコード化、検討、およびテストされていない関数に NOT FENCED を使用すると、 Db2® データベースの整合性に危険を招く可能性があります。 Db2 データベースでは、発生する可能性のある一般的な不注意による障害の多くに対して、いくつかの予防措置がとられていますが、NOT FENCED ユーザー定義関数が使用される場合には、完全な整合性を確保できません。

NOT THREADSAFE を宣言した関数は、NOT FENCED には変更できません (SQLSTATE 42613)。

関数が定義済みの AS LOCATOR の任意のパラメーターを有していて、 NO SQL オプションが指定されていた場合には、この関数は FENCED には変更できません (SQLSTATE 42613)。

このオプションは LANGUAGE OLE 関数、OLEDB 関数、 または CLR 関数を変更できません (SQLSTATE 42849)。

集約インターフェース関数のコンポーネント・ルーチンとして登録されている関数では、このオプションを変更できません (SQLSTATE 42849)。

SECURED または NOT SECURED
関数が行および列のアクセス制御に対してセキュアであるどうかを指定します。
NOT SECURED
関数がセキュアであると見なされないことを示します。 この関数が呼び出されるとき、この関数の引数は、列マスクが有効で列レベルのアクセス制御がその表でアクティブ化されている列を参照できません (SQLSTATE 428HA)。 この規則は、ステートメントのどこかで呼び出されるセキュアではないユーザー定義関数に適用されます。
SECURED
関数がセキュアであると見なされることを示します。

関数は、行権限または列マスクで参照されるときに、セキュアでなければなりません (SQLSTATE 428H8)。

関数がマテリアライズ照会表内で参照されており、そのマテリアライズ照会表が参照している表で行または列レベルのアクセス制御がアクティブになっている場合、その関数はセキュアでなければなりません (SQLSTATE 428H8)。

集約インターフェース関数のコンポーネント・ルーチンとして登録されている関数では、このオプションを変更できません (SQLSTATE 42849)。

THREADSAFE または NOT THREADSAFE
関数を他のルーチンと同じプロセスで実行しても安全か (THREADSAFE)、 そうでないか (NOT THREADSAFE) を指定します。
関数が OLE および OLEDB 以外の LANGUAGE で定義される場合:
  • 関数が THREADSAFE に定義されている場合には、 データベース・マネージャーは他のルーチンと同じプロセスで関数を呼び出すことができます。 一般に、スレッド・セーフにするには、関数はどのグローバルあるいは静的データ域をも使用してはなりません。 多くのプログラミング解説書には、スレッド・セーフ・ルーチンの作成に関する説明が含まれています。 FENCED および NOT FENCED 関数の両方が THREADSAFE になることが可能です。
  • 関数が NOT THREADSAFE と定義される場合には、データベース・マネージャーが関数を他のルーチンと同じプロセスで同時に呼び出すことは決してありません。 fenced された関数だけが、NOT THREADSAFE になり得ます (SQLSTATE 42613)。

このオプションは LANGUAGE OLE 関数または OLEDB 関数を変更できません (SQLSTATE 42849)。

集約インターフェース関数のコンポーネント・ルーチンとして登録されている関数では、このオプションを変更できません (SQLSTATE 42849)。

  • 以下のスキーマの関数は変更できません (SQLSTATE 42832)。
    • SYSIBM
    • SYSFUN
    • SYSPROC
  • LANGUAGE SQL で宣言した関数、ソース関数、またはテンプレート関数は変更できません (SQLSTATE 42917)。
  • NOT SECURED から SECURED への関数の変更: 通常、SECADM 権限を持つユーザーは、ユーザー定義関数およびトリガーなどのデータベース・オブジェクトを変更する特権を持ちません。 一般的に、このユーザーは、関数によって実行されるアクションを検査し、それがセキュアであることを確認してから、ユーザー定義関数をセキュアに変更するために必要な特権を持っているユーザーに対して、CREATE_SECURE_OBJECT 権限を付与します。 関数が変更された後、このユーザーは、権限を付与したユーザーの CREATE_SECURE_OBJECT 権限を取り消します。

    関数がセキュアであると見なされます。 SECURED 属性は、ユーザー定義関数に対するすべての変更についての変更制御監査プロシージャーをユーザーが確立したことを宣言する、アサーションとして見なされます。 データベース・マネージャーは、その制御監査プロシージャーが、すべての後続の ALTER FUNCTION ステートメントまたは外部パッケージに対する変更に有効であると見なします。

    関数に依存するパッケージおよび動的キャッシュ SQL ステートメントは、無効になる可能性があります。行レベルまたは列レベルのアクセス制御がアクティブになっている表、および置換する関数が関係するステートメントでは、セキュア属性がアクセス・パスの選択に影響を及ぼすためです。

  • SECURED から NOT SECURED への関数の変更: この関数はセキュアであるとは見なされません。 関数に依存するパッケージおよび動的キャッシュ SQL ステートメントは、無効になる可能性があります。行レベルまたは列レベルのアクセス制御がアクティブになっている表が関係するステートメントでは、セキュア属性がアクセス・パスの選択に影響を及ぼすためです。
  • セキュア関数での他のユーザー定義関数の呼び出し: 行または列のアクセス制御が強制適用された表が参照されるデータ操作ステートメントでセキュア・ユーザー定義関数が参照される場合、そのセキュア・ユーザー定義関数が他のユーザー定義関数を呼び出す場合には、データベース・マネージャーは、それらのネストしたユーザー定義関数がセキュアであるかどうかを妥当性検査しません。 これらのネストされた関数が機密データにアクセスできる場合、SECADM 権限を持つユーザーは、それらの関数がデータへのアクセスを許可されていること、およびそれらの関数に対するすべての変更に対して変更管理監査プロシージャーが確立されていることを確認する必要があります。

関数 MAIL() は完全にテストされました。 パフォーマンスを向上させるために、関数が fenced でないように変更します。
   ALTER FUNCTION MAIL() NOT FENCED