UNLOCK (SQL)
構文
UNLOCK [TABLE] tablename IN EXCLUSIVE MODE [IMMEDIATE]
UNLOCK [TABLE] tablename IN SHARE MODE [IMMEDIATE]
説明
UNLOCK コマンドは、LOCK コマンドがロックした SQL テーブルをアンロックします。このテーブルは、ユーザが適切な特権を持つ既存のテーブルである必要があります。tablename が一時テーブルである場合、コマンドは正常に完了しますが、処理は何も実行されません。tablename がビューである場合、SQLCODE -400 エラーが発生してコマンドが失敗します。
UNLOCK と UNLOCK TABLE は同義語です。
UNLOCK コマンドは LOCK 操作を取り消します。UNLOCK コマンドは、適用されているロックがない場合も正常に完了します。LOCK を使用してテーブルを複数回ロックすることができますが、明示的にロックした回数と同じ回数だけ明示的に UNLOCK を適用する必要があります。
特権
UNLOCK コマンドは特権を必要とする操作です。UNLOCK IN SHARE MODE を使用する前に、指定されたテーブルに対する SELECT 特権をプロセスに付与しておく必要があります。UNLOCK IN EXCLUSIVE MODE を使用する前に、指定されたテーブルに対する INSERT、UPDATE、および DELETE 特権をプロセスに付与しておく必要があります。IN EXCLUSIVE MODE では、テーブルの 1 つ以上のフィールドに対する INSERT、または UPDATE 特権が必要です。特権がない場合は、SQLCODE -99 エラー (特権違反) が返されます。%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが必要な特権を持っているかどうかを確認できます。$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが必要なテーブルレベルの特権を持っているかどうかを確認できます。特権の割り当てについては、"GRANT" コマンドを参照してください。
存在しないテーブル
存在しないテーブルをアンロックしようとすると、コンパイル・エラーが発生して UNLOCK が失敗し、[SQLCODE=-30 : テーブル 'SQLUser.mytable' が見つかりません] というメッセージが表示されます。
引数
tablename
アンロックするテーブルの名前。tablename は既存のテーブルでなければなりません。tablename は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。スキーマ検索パスは無視されます。
IN EXCLUSIVE MODE と IN SHARE MODE
キーワード句 IN EXCLUSIVE MODE は、通常の InterSystems IRIS ロックを解放します。キーワード句 IN SHARE MODE は、InterSystems IRIS レベルの共有ロックを解放します。
IMMEDIATE
オプションの引数です。指定しない場合、InterSystems IRIS は現在のトランザクションの終了時にロックを解放します。指定した場合、InterSystems IRIS はロックを即時に解放します。
例
以下の埋め込み SQL の例は、テーブルを作成してロックしてから、アンロックします。
NEW SQLCODE,%msg
&sql(CREATE TABLE mytest (
ID NUMBER(12,0) NOT NULL,
CREATE_DATE DATE DEFAULT CURRENT_TIMESTAMP(2),
WORK_START DATE DEFAULT SYSDATE) )
IF SQLCODE=0 { WRITE !,"Table created" }
ELSE { WRITE !,"CREATE TABLE error: ",SQLCODE
QUIT }
NEW SQLCODE,%msg
&sql(LOCK mytest IN EXCLUSIVE MODE)
IF SQLCODE=0 { WRITE !,"Table locked" }
ELSEIF SQLCODE=-110 { WRITE !,"Table is locked by another process",!,%msg }
ELSE { WRITE !,"Unexpected LOCK error: ",SQLCODE,!,%msg }
&sql(UNLOCK mytest IN EXCLUSIVE MODE)
IF SQLCODE=0 { WRITE !,"Table unlocked" }
ELSE { WRITE !,"Unexpected UNLOCK error: ",SQLCODE,!,%msg }