品質基準に適合しない新規外部ルーチンからシステムを保護するため、すべての外部ルーチンのデフォルトの実行モードは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。 そのような関数を非保護モードで実行すると、Teradata Databaseの正しい操作の妨げとなる恐れがあります。 |
関数が、オペレーティング システムのリソースを何も使用しない計算関数の場合 | EXECUTE NOT PROTECTED。 UDFを非保護モードで実行すると、関数の処理速度が大幅に向上します。 このオプションを使用するのは、関数の徹底的なデバッグを済ませて、正しい出力が得られることを確認した後にしてください。 |