Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

%CHECKPRIV

指定の特権がユーザにあるかどうかを確認します。

Synopsis

%CHECKPRIV [GRANT OPTION FOR | ADMIN OPTION FOR] syspriv [,syspriv]

%CHECKPRIV [GRANT OPTION FOR] objpriv ON object

%CHECKPRIV column-privilege (column-list) ON table

引数

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 列を含むテーブルまたはビューの名前。

概要

%CHECKPRIV には以下の 2 つの使用方法があります。

  • 現在のユーザに、指定のタイプのシステム特権があるかどうかを確認する。

  • 現在のユーザに、指定のオブジェクトに対する指定のタイプのユーザ特権があるかどうか確認する。これらのオブジェクトには、テーブルまたはビューに対するテーブル・レベルの特権、指定された列に対する列レベルの特権、およびストアド・プロシージャに対する特権を指定できます。

%CHECKPRIV を使用すると、特権を所有しているかどうかを確認できます。それによって特権を強要するわけではありません。実行時には、特権は、ODBC/JDBC、および Dynamic SQL (例えば、管理ポータルの [SQL文の実行] など) を使用して適用します。埋め込み SQL については、特権が適用されません。%CHECKPRIV は、主に埋め込み SQL のために使用されます。

ユーザに指定の特権がある場合、%CHECKPRIV は SQLCODE=0 を設定し、その特権がない場合は SQLCODE=100 を設定します。

%CHECKPRIV は、その結果を判断するために SQLCODE 100 値 (SQLCODE 状態値であり、SQLCODE エラー値ではない) にアクセスする必要があるため、エラー状態とエラーのない状態とを区別することしかできない JDBC および他のクライアントから直接使用することはできません。

%CHECKPRIV はすぐに作成および実行され、通常一度しか実行されないため、Caché では、%CHECKPRIV にはクエリ・キャッシュは作成されません。

$SYSTEM.SQL.CheckPriv()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが指定されたテーブルレベルの特権を持っているかどうかを確認できます。

埋め込み SQL と特権

埋め込み SQL については、特権が自動的に確認されることや適用されることはありません。したがって、埋め込み SQL プログラムでは (ほとんどの場合)、更新作業のように特権を必要とする操作を実行する前に、%CHECKPRIV を呼び出しておく必要があります。

  SET name="fred",age=99
  SET SQLCODE=""
  &sql(%CHECKPRIV UPDATE ON Sample.Person)
  IF SQLCODE=100 {
     WRITE !,"No UPDATE privilege"
     QUIT }
  ELSEIF SQLCODE < 0 {
     WRITE !,"Unexpected SQL error: ",SQLCODE
     QUIT }
  ELSE { 
     WRITE !,"Proceeding with UPDATE" }
  &sql(UPDATE Sample.Person SET Name=:name,Age=:age)
  IF SQLCODE=0 { WRITE !,"UPDATE successful" }
  ELSE { WRITE "UPDATE error SQLCODE=",SQLCODE }

以下の埋め込み SQL の例では、特定のテーブルに対する特定のオブジェクト特権が現在のユーザにあるかどうかを確認します。

  &sql(%CHECKPRIV UPDATE ON Sample.Person)
  IF SQLCODE=0 {WRITE "Have privilege"}
  ELSEIF SQLCODE=100 {WRITE "Do not have privilege"}
  ELSE {WRITE "Unexpected SQLCODE error: ",SQLCODE}

以下の埋め込み SQL の例では、すべてのテーブルに対する 3 種類のテーブル操作のシステム特権が現在のユーザにあるかどうかを確認します。

  &sql(%CHECKPRIV %CREATE_TABLE,%ALTER_TABLE,%DROP_TABLE)
  IF SQLCODE=0 {WRITE "Have privileges"}
  ELSEIF SQLCODE=100 {WRITE "Do not have one or more privileges"}
  ELSE {WRITE "Unexpected SQLCODE error: ",SQLCODE}

以下の埋め込み SQL の例では、16 個すべてのオブジェクト定義特権が現在のユーザにあるかどうかを確認します。SQLCODE 値は、16 個のオブジェクトすべてに対する特権があれば 0、1 つでも特権のないオブジェクトがあれば 100 に設定されます。

  &sql(%CHECKPRIV %DB_OBJECT_DEFINITION)
  IF SQLCODE=0 {WRITE "Have all privileges"}
  ELSEIF SQLCODE=100 {WRITE "Do not have one or more privileges"}
  ELSE {WRITE "Unexpected SQLCODE error: ",SQLCODE}

以下の埋め込み 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}

以下の埋め込み 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}

関連項目

FeedbackOpens in a new tab