文章目录

第四十一章 SQL命令 DROP VIEW

删除视图

大纲
DROP VIEW view-name [CASCADE | RESTRICT]

参数

  • view-name 要删除的视图的名称。
    视图名可以是限定的(schema.viewname),也可以是非限定的(viewname)。
    非限定视图名接受默认模式名。
  • CASCADE RESTRICT - 可选-指定CASCADE关键字以删除引用view-name的任何其他视图。如果有另一个视图引用view-name,则指定RESTRITE将发出SQLCODE-321错误。默认值为限制。
描述

DROP VIEW命令删除视图,但不删除基础表或数据。

也可以使用DropView()方法调用来调用拖放视图操作:

$SYSTEM.SQL.Schema.DropView(viewname,SQLCODE,%msg)

权限

DROP VIEW命令是特权操作。在使用DROP VIEW之前,进程必须拥有指定视图的%DROP_VIEW管理权限或DELETE OBJECT权限。否则将导致SQLCODE-99错误(特权冲突)。可以通过调用%CHECKPRIV命令来确定当前用户是否具有删除权限。可以通过调用$SYSTEM.SQL.Security.CheckPrivileve()方法来确定指定用户是否具有删除权限。如果拥有适当的授予权限,则可以使用GRANT命令分配%DROP_VIEW权限。

在嵌入式SQL中,可以使用$SYSTEM.Security.Login()方法以具有适当权限的用户身份登录:

   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )

必须具有%Service_Login:Use权限才能调用$SYSTEM.Security.Login方法。

可以删除基于从部署的持久类投影的表的视图。

Nonexistent View

要确定当前命名空间中是否存在指定视图,请使用$SYSTEM.SQL.Schema.ViewExists()方法。

默认情况下,如果尝试删除不存在的视图,DROP VIEW会发出SQLCODE-30错误。要确定当前设置,请调用$SYSTEM.SQL.CurrentSettings(),它显示允许DDL删除不存在的表或视图设置。默认值为0(“否”)。这是此选项的推荐设置。如果设置为1(“Yes”),则为不存在的视图和表发出DROP VIEWDROP TABLE不会执行任何操作,也不会发出错误消息。

在管理门户、系统管理、配置、SQL和对象设置中,通过选中忽略冗余DDL语句复选框,可以在系统范围内设置此选项(以及其他类似的创建、更改和删除选项)。

其他视图引用的视图

如果试图删除其他视图在其查询中引用的视图,DROP VIEW默认情况下会发出SQLCODE-321错误。这就是限制关键字行为。

通过指定CASCADE关键字,可以成功删除其他视图在其查询中引用的视图。删除视图还会删除这些其他视图。如果 IRIS无法执行所有级联视图删除操作(例如,由于SQLCODE-300错误),则不会删除任何视图。

关联查询

删除视图会自动清除所有相关的缓存查询,并清除%SYS.PTools.StatsSQL生成的查询信息。删除视图会自动清除任何相关查询的所有SQL运行时统计信息(SQL Stat)信息。

示例

下面的嵌入式SQL示例创建名为“CityAddressBook”的视图,然后删除该视图。由于它是使用RESTRITE关键字(默认值)指定的,因此如果该视图被其他视图引用,则会发出SQLCODE-321错误:

ClassMethod DropView()
{
	&sql(
		CREATE VIEW CityAddressBook AS
			SELECT Name,Home_Street FROM Sample.Person 
			WHERE Home_City='Boston'
	)
	if SQLCODE=0 { 
		w !,"视图创建" 
	} else { 
		w !,"创建视图错误: ",SQLCODE
		q 
	} 
	/* Use the view */
	n SQLCODE,%msg
	&sql(
		DROP VIEW CityAddressBook RESTRICT
	) 
	if SQLCODE=0 { 
		w !,"删除视图" 
	} elseif SQLCODE=-30 { 
		w !,"视图不存在",!,%msg 
	} elseif SQLCODE=-321 { 
		w !,"其他视图引用的视图",!,%msg 
	} else { 
		w !,"其他删除视图错误: ",SQLCODE,!,%msg 
	}
}