第八十一章 SQL命令 UNLOCK

426 阅读2分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

第八十一章 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错误。

UNLOCKUNLOCK TABLE是同义词。

UNLOCK命令用来反转LOCK操作。 即使没有锁被持有,UNLOCK命令也会成功完成。 可以使用LOCK多次锁定一个表; 必须显式解锁表,解锁次数为表被显式锁定的次数。

权限

该命令为特权操作。 在使用UNLOCK IN SHARE MODE之前,进程必须对指定的表拥有SELECT权限。 在使用UNLOCK IN EXCLUSIVE MODE之前,进程必须对指定的表具有INSERTUPDATEDELETE权限。 对于IN EXCLUSIVE MODE, INSERTUPDATE特权必须在表的至少一个字段上。 未能持有足够的特权将导致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()
 
锁表
解锁表