17.10 - 非保護モードを指定するべき状況 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

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

品質基準に適合しない新規外部ルーチンからシステムを保護するため、すべての外部ルーチンのデフォルトの実行モードはEXECUTE PROTECTEDになっています。デフォルトでCREATE/REPLACE FUNCTIONがEXECUTE NOT PROTECTEDに指定されているとしたら、作成された関数のエラーによってシステムが破損してしまうでしょう。

保護モードは、システムの破損を防ぐために、メモリ アドレス違反、データ構造の破損、不正な計算(ゼロで割る計算など)を捕捉するデータベースの状態です。保護モードは、CPUやメモリ ループまたはオペレーティング システムの入出力(読取り/書込み操作のための外部ファイルのオープンなど)に対して検出も保護もしません

この実行モードでは、独自のローカル作業領域内の別個のプロセス(あるいは「プラットフォーム」)として外部ルーチンがアクセスする可能性がある、すべてのデータを隔離します(詳細は、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照)。何らかのメモリ違反または他のシステム エラーが生じた場合、エラーはルーチンとこれを実行するトランザクションにとどめられ、データベース全体に及ぶことはありません(詳細は、保護実行モードと非保護実行モードを参照)。

この隔離によりルーチンの実行は低速にもなるため、CまたはC++ルーチンが実働環境で使用するための品質基準をすべて満たしたなら、保護モードを非保護に変える必要があります。ルーチンの実行モードを変更するには、単純なALTER FUNCTIONリクエストにEXECUTE NOT PROTECTEDオプションを指定します。

Java UDFと行レベル セキュリティ制約UDFは、どちらも保護モードで実行するSYSUDTLIB。また、非保護モードで実行するように変更することはできません(Java UDFの特別な考慮事項を参照)。

OSシステム呼出しを行なうUDFに対してはこの変更を行いません。この種のUDFは常に保護モードで実行する必要があります。保護モードを変更した後で、外部ルーチンの再コンパイルや再リンクは不要です。

原則として、DBAはCPU専用の操作を実行する関数に対して(EXECUTE NOT PROTECTEDオプションによって割り当てられる)直接実行モードを指定する前にまず完全にデバッグを実行する必要があります。モードを変更して非保護モードで実行する権限をDBA以外のユーザーに(UDFを作成するソフトウェア技術員にさえ)与えないでください。OSが非保護モードでシステム リソースを消費する原因となる外部ルーチンは実行しないでください。これには、OSによるシステム コンテキストの割振りを引き起こすものすべて、たとえば、オープン ファイル、パイプ、セマフォー、トークン、スレッド(プロセス)などが含まれます。

以下の表にUDF保護モードの使用法を要約します。

条件 指定内容
まだ関数の開発およびデバッグ中の場合 EXECUTE PROTECTED。
関数がJavaで記述されている場合 EXECUTE PROTECTED。

Java関数を変更して非保護モードで実行することができません。

関数がファイルを開く場合、あるいはオペレーティング システムによる追跡を要するオペレーティング システムの別のリソースを使用する場合

これには、OSによるシステム コンテキストの割振りを引き起こすものすべて、たとえば、オープン ファイル、パイプ、セマフォー、トークン、スレッド(プロセス)などが含まれます。

EXECUTE PROTECTED。

そのような関数を非保護モードで実行すると、データベースの正しい操作の妨げとなる恐れがあります。

関数が、オペレーティング システムのリソースを何も使用しない計算関数の場合 EXECUTE NOT PROTECTED。

UDFを非保護モードで実行すると、関数の処理速度が大幅に向上します。

このオプションを使用するのは、関数の徹底的なデバッグを済ませて、正しい出力が得られることを確認した後にしてください。