第八十一章 SQL命令 UNLOCK

解锁表

大纲
UNLOCK [TABLE] tablename IN EXCLUSIVE MODE [IMMEDIATE]


UNLOCK [TABLE] tablename IN SHARE MODE [IMMEDIATE]

参数

  • ​tablename​​ - 要解锁的表的名称。

​Tablename​​必须是已经存在的表。表名可以是限定的(​


​schema.table​​),也可以是非限定的(​​table​​)。 非限定表名接受默认模式名。 模式搜索路径被忽略。

  • ​IN EXCLUSIVE MODE​​ / ​​IN SHARE MODE​​ - ​​IN EXCLUSIVE MODE​​关键字短语释放常规的IRIS锁。

​IN SHARE MODE​​关键字短语在IRIS级别释放共享锁。

描述

​UNLOCK​​命令用来解锁被​​LOCK​​命令锁定的SQL表。此表必须是已存在的表,您对其具有必要的特权。 如果​


​tablename​​是临时表,则命令执行成功,但不执行任何操作。如果​


​tablename​​是视图,则命令失败,并出现​​SQLCODE -400​​错误。​


​UNLOCK​​和​​UNLOCK TABLE​​是同义词。​


​UNLOCK​​命令用来反转​​LOCK​​操作。即使没有锁被持有,​


​UNLOCK​​命令也会成功完成。可以使用​


​LOCK​​多次锁定一个表; 必须显式解锁表,解锁次数为表被显式锁定的次数。

权限

该命令为特权操作。 在使用​​UNLOCK IN SHARE MODE​​之前,进程必须对指定的表拥有​​SELECT​​权限。在使用​


​UNLOCK IN EXCLUSIVE MODE​​之前,进程必须对指定的表具有​​INSERT​​、​​UPDATE​​或​​DELETE​​权限。对于​


​IN EXCLUSIVE MODE, INSERT​​或​​UPDATE​​特权必须在表的至少一个字段上。未能持有足够的特权将导致​


​SQLCODE -99​​错误(特权违反)。可以通过调用​


​%CHECKPRIV​​命令来确定当前用户是否具有必要的特权。通过调用​


​$SYSTEM.SQL.Security.CheckPrivilege()​​方法,可以确定指定的用户是否具有必要的表级特权。

Nonexistent Table

如果试图解锁一个不存在的表,则​​unlock​​会失败,并出现编译错误,并且会出现​​SQLCODE=-30: table 'SQLUser. txt . txt​​消息。 mytable”未找到。

示例

下面的嵌入式SQL示例创建一个表,锁定它,然后解锁它:

ClassMethod Unlock()
{
n 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 {
w !,"创建表"
} else {
w !,"CREATE TABLE error: ",SQLCODE
q
}
}
ClassMethod Unlock1()
{
n SQLCODE,%msg
&sql(
LOCK mytest IN EXCLUSIVE MODE
)
if SQLCODE =0 {
w !,"锁表"
} elseif SQLCODE = -110 {
w !,"表被另一个进程锁定",!,%msg
} else {
w !,"其他 LOCK error: ",SQLCODE,!,%msg
}
&sql(
UNLOCK mytest IN EXCLUSIVE MODE
)
if SQLCODE=0 {
w !,"解锁表"
} else {
w !,"其他 UNLOCK error: ",SQLCODE,!,%msg
}
}
DHC-APP>d ##class(PHA.TEST.SQLCommand).Unlock1()

锁表
解锁表