Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

CREATE ROLE (SQL)

ロールを生成します。

Synopsis

CREATE ROLE role-name

引数

引数 説明
role-name 生成するロールの名前。識別子です。ロール名は、大文字と小文字が区別されません。詳細は、"InterSystems SQL の使用法" の “識別子” の章を参照してください。

概要

CREATE ROLE コマンドはロールを生成します。ロールは複数のユーザに割り当てることができる名前付きの特権セットです。1 つのロールを複数のユーザに割り当てることも、また複数のロールを 1 人のユーザに割り当てることもできます。ロールはシステム全体で利用できるもので、特定のネームスペースに限定されません。

role-name は 64 文字までの有効な識別子です。role-name は、識別子の名前付け規約に従っている必要があります。ロール名には Unicode 文字を使用することができます。ロール名は、大文字と小文字が区別されません。[区切り識別子をサポート] 構成オプションにチェックが付いている場合 (既定)、role-name を、引用符で囲まれた区切り識別子にすることができます。区切り識別子の場合、role-name に SQL 予約語を使用できます。ピリオド (.)、キャレット (^)、および 2 文字の矢印シーケンス (->) を含めることもできます。コンマ (,) またはコロン (:) 文字を含めることはできません。この名前の先頭の文字には、アスタリスク (*) を除く任意の有効な文字を使用できます。

最初に作成されたときは、ロールは名前が付いているだけで特権はありません。ロールに特権を付与するには、GRANT コマンドを使用します。GRANT コマンドを使用すると、1 つのロールに 1 つ以上のロールを割り当てることもできます。この方法によってロールの階層を作成することができます。

CREATE ROLE を実行して既に存在するロールを作成しようとすると、SQL は SQLCODE -118 エラーを返します。$SYSTEM.SQL.Security.RoleExists()Opens in a new tab メソッドを呼び出すことによって、ロールが既に存在するかどうかを判別できます。

  WRITE $SYSTEM.SQL.Security.RoleExists("%All"),!
  WRITE $SYSTEM.SQL.Security.RoleExists("Madmen")

このメソッドは、指定したロールが存在する場合 1 を返し、存在しない場合は 0 を返します。ロール名は、大文字と小文字が区別されません。

ロールの削除には、DROP ROLE コマンドを使用します。

特権

CREATE ROLE コマンドの実行には特権が必要です。埋め込み SQL で CREATE ROLE を使用する前に、以下のいずれかを持つユーザとしてログインする必要があります。

  • USE 権限がある %Admin_Secure 管理リソース

  • USE 権限がある %Admin_RoleEdit 管理リソース

  • システムに対する全面的なセキュリティ権限

これらの特権がない場合に CREATE ROLE コマンドを実行すると、SQLCODE -99 エラー (特権違反) が返されます。$SYSTEM.Security.Login()Opens in a new tab メソッドを使用して、以下のようにユーザに適切な特権を割り当ててください。

   DO $SYSTEM.Security.Login(username,password)
   &sql(      )

$SYSTEM.Security.Login() メソッドを呼び出すには、%Service_Login:Use 特権が必要です。詳細は、"インターシステムズ・クラス・リファレンス" の "%SYSTEM.SecurityOpens in a new tab" を参照してください。

以下の例は、BkUser という名前のロールを作成します。最初の例のユーザ "FRED" にはロール作成特権がありません。次の例のユーザ "_SYSTEM" にはロール作成特権があります。

  DO $SYSTEM.Security.Login("FRED","FredsPassword")
  &sql(CREATE ROLE BkUser)
  IF SQLCODE=-99 {
    WRITE !,"You don't have CREATE ROLE privileges" }
  ELSEIF SQLCODE=-118 {
    WRITE !,"The role already exists" }
  ELSE {
    WRITE !,"Created a role. Error code is: ",SQLCODE }
  DO $SYSTEM.Security.Login("_SYSTEM","SYS")
Main
  &sql(CREATE ROLE BkUser)
  IF SQLCODE=-99 {
    WRITE !,"You don't have CREATE ROLE privileges" }
  ELSEIF SQLCODE=-118 {
    WRITE !,"The role already exists" }
  ELSE {
    WRITE !,"Created a role. Error code is: ",SQLCODE }
Cleanup
   SET toggle=$RANDOM(2)
   IF toggle=0 { 
     &sql(DROP ROLE BkUser)
     WRITE !,"DROP USER error code: ",SQLCODE
   }
   ELSE { 
     WRITE !,"No drop this time"
     QUIT 
   }

($RANDOM トグルが記述されているので、このプログラム例を繰り返し実行できます。)

関連項目

FeedbackOpens in a new tab