概要
%CHECKPRIV には以下の 2 つの使用方法があります。
ユーザが指定された特権を保持している場合、%CHECKPRIV は SQLCODE=0 を設定します。ユーザが指定された特権を保持していない場合、%CHECKPRIV は SQLCODE=100 を設定します。
%CHECKPRIV を使用すると、特権を所有しているかどうかを確認できます。それによって特権を強要するわけではありません。
-
埋め込み SQL は、SQL 特権を強要しません。%CHECKPRIV は、主に埋め込み SQL のために使用されます。"埋め込み SQL と特権" を参照してください。
-
ダイナミック SQL は、実行時に特権を強要します。例えば、%CREATE_TABLE システム特権がない場合、%CHECKPRIV %CREATE_TABLE は SQLCODE=100 を設定し、この特権がないことを示します。ダイナミック SQL はこの特権を強要します。CREATE TABLE 操作は SQLCODE -99 エラーで失敗します。
実行時、ダイナミック SQL と ODBC/JDBC は特権を強要し、適切なエラーを生成します。管理ポータルの [クエリ実行] SQL インタフェースと SQL シェルはどちらもダイナミック SQL として実行します。
%CHECKPRIV は、その結果を判断するために SQLCODE 100 値 (SQLCODE 状態値であり、SQLCODE エラー値ではない) にアクセスする必要があるため、エラー状態とエラーのない状態とを区別することしかできない JDBC および他のクライアントから直接 %CHECKPRIV を使用することはできません。
%CHECKPRIV はすぐに作成および実行され、通常一度しか実行されないため、InterSystems IRIS では、%CHECKPRIV にはクエリ・キャッシュは作成されません。
CheckPrivilege() メソッド
$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドは、テーブル、ビュー、またはストアド・プロシージャに対するユーザの特権のチェックのためのより優れた機能を提供します。
-
CheckPrivilege() は、指定されたユーザの特権をチェックします。%CHECKPRIV は、現在のユーザの特権のみをチェックします。
-
CheckPrivilege() は、複数の特権をチェックできます。%CHECKPRIV の呼び出しごとに 1 つの objpriv 特権のみをチェックできます。
-
CheckPrivilege() では、別のネームスペースで定義されたテーブル、ビュー、またはプロシージャに対する特権をチェックできます。%CHECKPRIV は、現在のネームスペース内のオブジェクトの特権のみをチェックします。
埋め込み SQL と特権
埋め込み SQL については、特権が自動的に確認されることや適用されることはありません。したがって、埋め込み SQL プログラムでは (ほとんどの場合)、更新作業のように特権を必要とする操作を実行する前に、%CHECKPRIV を呼び出しておく必要があります。
SET name="Fred",age=25
SET SQLCODE=""
&sql(%CHECKPRIV UPDATE ON Sample.Person)
IF SQLCODE=100 {
WRITE !,"No UPDATE privilege"
QUIT }
ELSEIF SQLCODE < 0 {
WRITE !,"Unexpected SQL error: ",SQLCODE," ",%msg
QUIT }
ELSE {
WRITE !,"Proceeding with UPDATE" }
&sql(UPDATE Sample.Person SET Name=:name,Age=:age WHERE Address='123 Bedrock')
IF SQLCODE=0 { WRITE !,"UPDATE successful" }
ELSE { WRITE "UPDATE error SQLCODE=",SQLCODE }
例
以下の埋め込み SQL の例では、特定のテーブルに対する特定のオブジェクト特権が現在のユーザにあるかどうかを確認します。
&sql(%CHECKPRIV UPDATE ON Sample.Person)
IF SQLCODE=0 {WRITE "Have update privilege"}
ELSEIF SQLCODE=100 {WRITE "Do not have update privilege" QUIT}
ELSE {WRITE "Unexpected %CHECKPRIV error: ",SQLCODE," ",%msg QUIT}
以下の埋め込み SQL の例では、3 種類のテーブル操作のシステム特権が現在のユーザにあるかどうかを確認します。特権がある場合、ユーザは以下のようにテーブルを作成します。
&sql(%CHECKPRIV %CREATE_TABLE,%ALTER_TABLE,%DROP_TABLE)
IF SQLCODE=0 {WRITE "Have table privileges",!}
ELSEIF SQLCODE=100 {WRITE "Do not have one or more table privileges" QUIT}
ELSE {WRITE "Unexpected %CHECKPRIV error: ",SQLCODE," ",%msg QUIT}
&sql(CREATE TABLE Sample.MyTable (Name VARCHAR(40),Age INTEGER))
WRITE "Created table"
以下の埋め込み SQL の例では、16 個すべてのオブジェクト定義特権が現在のユーザにあるかどうかを確認します。SQLCODE 値は、16 個のオブジェクトすべてに対する特権があれば 0、1 つでも特権のないオブジェクトがあれば 100 に設定されます。
&sql(%CHECKPRIV %DB_OBJECT_DEFINITION)
IF SQLCODE=0 {WRITE "Have all system privileges"}
ELSEIF SQLCODE=100 {WRITE "Do not have one or more system privileges"}
ELSE {WRITE "Unexpected SQLCODE error: ",SQLCODE," ",%msg}
以下の埋め込み SQL の例では、現在のユーザが、他のユーザやロールに %CREATE_TABLE 特権を付与できるかどうかを確認します。
&sql(%CHECKPRIV ADMIN OPTION FOR %CREATE_TABLE)
IF SQLCODE=0 {WRITE "Have admin option on privilege"}
ELSEIF SQLCODE=100 {WRITE "Do not have admin option on privilege"}
ELSE {WRITE "Unexpected SQLCODE error: ",SQLCODE," ",%msg}
以下の埋め込み SQL の例では、指定した列レベルの特権が現在のユーザにあるかどうかを確認します。特権の名前に続いて、列の名前 (またはコンマで区切られた列のリスト) を括弧で囲んで指定します。
&sql(%CHECKPRIV UPDATE(Name,Age) ON Sample.Person)
IF SQLCODE=0 {WRITE "Have privilege on all specified columns"}
ELSEIF SQLCODE=100 {WRITE "Do not have privilege on one or more specified columns"}
ELSE {WRITE "Unexpected SQLCODE error: ",SQLCODE," ",%msg}