この例では、テーブルの制約列値を更新するための行レベル セキュリティ関数をいくつか作成します。これらの関数に関する注意点を以下にまとめます。
- パラメータ名CURRENT_SESSIONでは、パラメータのソース データを、UDFに関連する制約のセッションで現在設定されている値として定義します。
- パラメータ名INPUT_ROWでは、パラメータのソース データを、呼び出しリクエストの対象行の対応する制約列の値として定義します。
- さまざまな関数例でこれらの制約に割り当てられているデータ型を見れば、実行するDML操作が分類制約に該当するのか、区画制約に該当するのかを確認できます。
insert_level関数は、入力としてセッションのレベル値(パラメータ名CURRENT_SESSIONで確認できる値)を使用して行を挿入し、その新しい行に割り当てるレベルを返します。CURRENT_SESSIONパラメータは、SMALLINTデータ型で定義されているので、挿入するレベル値は、階層型分類制約の1つの値にかかわっていることを確認できます。
CREATE FUNCTION SYSLIB.insert_level ( CURRENT_SESSION SMALLINT) RETURNS SMALLINT LANGUAGE C NO SQL PARAMETER STYLE TD_GENERAL EXTERNAL NAME 'CS!insertlevel!c:\cctests\insertlevel.c';
update_level関数は、入力としてセッションのレベル値(パラメータ名CURRENT_SESSIONで確認できる値)と、ターゲット行のレベル値(INPUT_ROWパラメータで確認できる値)を使用して、行を更新します。さらに、その更新行に割り当てるレベルを返します。CURRENT_SESSIONパラメータもINPUT_ROWパラメータも、SMALLINTデータ型で定義されているので、更新するレベル値は、階層型分類制約の1つの値にかかわっていることになります。
CREATE FUNCTION SYSLIB.update_level ( CURRENT_SESSION SMALLINT, INPUT_ROW SMALLINT) RETURNS SMALLINT LANGUAGE C NO SQL PARAMETER STYLE TD_GENERAL EXTERNAL NAME 'CS!updatelevel!c:\cctests\updatelevel.c';
delete_level関数は、入力としてターゲット行のレベル値(パラメータ名INPUT_ROWで確認できる値)を使用して、行を削除します。INPUT_ROWパラメータは、SMALLINTデータ型で定義されているので、削除するレベル値は、階層型分類制約の1つの値にかかわっていることになります。
このUDFに関連する外部関数、文字TまたはFを返します。Tは、指定の削除操作を実行できるという意味であり、Fは、指定の削除操作を実行できないという意味です。
CREATE FUNCTION SYSLIB.delete_level ( INPUT_ROW SMALLINT) RETURNS CHARACTER LANGUAGE C NO SQL PARAMETER STYLE TD_GENERAL EXTERNAL NAME 'CS!deletelevel!c:\cctests\deletelevel.c';
read_level関数は、入力としてセッションのレベル値(パラメータ名CURRENT_SESSIONで確認できる値)と、ターゲット行のレベル値(INPUT_ROWパラメータで確認できる値)を使用して、行を選択します。CURRENT_SESSIONパラメータもINPUT_ROWパラメータも、SMALLINTデータ型で定義されているので、読み取る行は、階層型分類制約の1つの値にかかわっていることになります。
このUDFに関連する外部関数、文字TまたはFを返します。Tは、選択操作を実行できるという意味であり、Fは、選択操作を実行できないという意味です。
CREATE FUNCTION SYSLIB.read_level ( CURRENT_SESSION SMALLINT, INPUT_ROW SMALLINT) RETURNS CHARACTER LANGUAGE C NO SQL PARAMETER STYLE TD_GENERAL EXTERNAL NAME 'CS!readlevel!c:\cctests\readlevel.c';
この関数は、入力としてセッションのカテゴリ値(CURRENT_SESSIONパラメータで確認できる値)を使用して、行を挿入します。CURRENT_SESSIONパラメータは、BYTE(8)データ型で定義されているので、挿入する行は、非階層型区画制約にかかわっていることを確認できます。
このUDFに関連する外部関数は、その新しい行に割り当てるカテゴリ値を返します。
CREATE FUNCTION SYSLIB.insert_category ( CURRENT_SESSION BYTE(8)) RETURNS BYTE(8) LANGUAGE C NO SQL PARAMETER STYLE SQL EXTERNAL NAME 'CS!insert_category!c:\cctests\insert_category.c';
update_category関数は、入力としてセッションのカテゴリ値(パラメータ名CURRENT_SESSIONで確認できる値)と、ターゲット行のカテゴリ値(INPUT_ROWパラメータで確認できる値)を使用して、行を更新します。CURRENT_SESSIONパラメータもINPUT_ROWパラメータも、BYTE(8)データ型で定義されているので、更新する行は、非階層型区画制約にかかわっていることになります。
このUDFに関連する外部関数は、その更新行に割り当てるカテゴリ値を返します。
CREATE FUNCTION SYSLIB.UpdateCategory ( CURRENT_SESSION BYTE(8), INPUT_ROW BYTE(8)) RETURNS BYTE(8) LANGUAGE C NO SQL PARAMETER STYLE SQL EXTERNAL NAME 'CS!updatecategory!c:\cctests\updatecategory.c';
行を削除する関数は、入力としてターゲット行のカテゴリ値(INPUT_ROWパラメータで確認できる値)を受け取り、文字TまたはFを返します。Tは、指定の削除操作を実行できるという意味であり、Fは、指定の削除操作を実行できないという意味です。
CREATE FUNCTION SYSLIB.DeleteCategory ( INPUT_ROW BYTE(8)) RETURNS CHARACTER LANGUAGE C NO SQL PARAMETER STYLE SQL EXTERNAL NAME 'CS!deletecategory!c:\cctests\deletecategory.c';
行を選択する関数は、入力としてセッションのカテゴリ値(CURRENT_SESSIONパラメータで確認できる値)とターゲット行のカテゴリ値(INPUT_ROWパラメータで確認できる値)を受け取り、出力として文字TまたはFを返します。Tは、選択操作を実行できるという意味であり、Fは、選択操作を実行できないという意味です。
CREATE FUNCTION SYSLIB.ReadCategory ( CURRENT_SESSION BYTE(8), INPUT_ROW BYTE(8)) RETURNS CHARACTER LANGUAGE C NO SQL PARAMETER STYLE SQL EXTERNAL NAME 'CS!readcategory!c:\cctests\readcategory.c';