%CHECKPRIV (SQL)
構文
%CHECKPRIV [GRANT OPTION FOR | ADMIN OPTION FOR] syspriv [,syspriv]
%CHECKPRIV [GRANT OPTION FOR] objpriv
ON object
%CHECKPRIV column-privilege (column-list)
ON table
概要
%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 }
引数
GRANT OPTION FOR
このキーワードは、現在のユーザが指定の特権について WITH GRANT OPTION 特権を持っているかどうか確認することを指定します (オプション)。このオプションを設定した %CHECKPRIV では、ユーザが指定の特権を持っているかどうかが確認されません。
ADMIN OPTION FOR
このキーワードは、現在のユーザが、指定の特権を他のユーザやロールに付与できるかどうか確認することを指定します (オプション)。このオプションを設定した %CHECKPRIV では、ユーザが指定の特権を持っているかどうかが確認されません。
syspriv
1 つのシステム特権です。または、複数のシステム特権をコンマで区切って列挙した一覧です。使用可能な syspriv オプションには、16 個のオブジェクト定義特権と 4 つのデータ変更特権が含まれています。
それらのオブジェクト定義特権は、%CREATE_FUNCTION、%DROP_FUNCTION、%CREATE_METHOD、%DROP_METHOD、%CREATE_PROCEDURE、%DROP_PROCEDURE、%CREATE_QUERY、%DROP_QUERY、%CREATE_TABLE、%ALTER_TABLE、%DROP_TABLE、%CREATE_VIEW、%ALTER_VIEW、%DROP_VIEW、%CREATE_TRIGGER、%DROP_TRIGGER です。%DB_OBJECT_DEFINITION を指定すれば、この 16 個のオブジェクト定義特権すべてについて確認できます。
データ変更特権は、INSERT、UPDATE、および DELETE 操作のための %NOCHECK、%NOINDEX、%NOLOCK、%NOTRIGGER 特権です。
objpriv
指定の object に関係するオブジェクト特権です。指定できるオプションは、%ALTER、DELETE、SELECT、INSERT、UPDATE、EXECUTE、および REFERENCES です。
object
objpriv の確認対象とするオブジェクトの名前です。
column-privilege
1 つ以上のリストされた列に関連付けられている列レベルの特権。指定できるオプションは、SELECT、INSERT、UPDATE、および REFERENCES です。
column-list
特権の割り当てをチェックする 1 つ以上の列名のリスト。このリストは括弧で囲み、リスト内の項目はコンマで区切ります。column-privilege 名と最初の括弧の間には、スペースを入れることも省略することもできます。
table
column-list 列を含むテーブルまたはビューの名前。テーブル名またはビュー名は修飾 (schema.tablename)、未修飾 (tablename) のどちらでもかまいません。未修飾名は既定のスキーマ名を取ります。スキーマ検索パスは無視されます。
例
以下の埋め込み 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}