EXTERNAL SECURITY句のDEFINER許可を持つ外部ルーチンは常に、許可オブジェクトの作成者に関連したOSユーザー許可を使用します。
EXTERNAL SECURITY句のINVOKER許可を持つ外部ルーチンは、それを呼び出すデータベース ユーザーに関連したOSユーザー許可を使用します。
どちらのルーチンも外部許可を必要とします。違いは、ルーチンが実行時に使用するOSユーザー許可にあります。
- DEFINER許可によってルーチンを定義する場合、すべて同じOSユーザー許可(許可を作成したユーザーのOSユーザー許可)が使用されます。
- INVOKER許可によってルーチンを定義する場合、すべて異なるOSユーザー許可(ルーチンを呼び出すユーザーのOSユーザー許可)が使用されます。
以下の表にその違いのサマリーを示します。
外部ルーチンの実行時に使用するOSユーザー許可 | 指定する許可の種類 |
---|---|
同じOSユーザー許可(ルーチンを実行するユーザーとは関係ない) | DEFINER。 |
ルーチンを実行するユーザーによって指定されるOSユーザー許可 | INVOKER。 |
INVOKER許可を定義すると、データベースはINVOKER_AUTHという2番目の許可を同じデータベースの下に作成します(次ページのレポートを参照)。
INVOKER許可はデータベースごとに1つだけしか存在できません。そのため、この許可が1つ定義されると、データベースは指定された名前で1つのエントリを作成し、さらにINVOKER_DEFAULTという名前でもう1つの複製エントリを作成します。どちらのエントリもDBC.TVMに保管されます。これら2つのINVOKERのデフォルト エントリは、名前以外は同一です。
EXTERNAL SECURITY INVOKER句をUDFに指定する場合、許可名は存在しません。データベースは、現在のデータベースのDBC.TVM内でINVOKER_DEFAULT名を検索します。データベースごとに1つの名前しかないため、正しいエントリが見つかります。
この許可のために作成した名前を指定するAUTHORIZATIONをDROPすると、データベースは両方のエントリを削除します。<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>の「DROP AUTHORIZATION」を参照してください。
SELECT * FROM DBC.authorizationsV ORDER BY databasename;