删除视图
大纲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 VIEW
或DROP 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
}
}