尝试变更为表或视图定义的模式时,要求数据库服务器考虑是否有受更改影响的相关视图。举例来说,模式变更操作包括:
删除表、视图、实例化视图或列
重命名表、视图、实例化视图或列
添加、删除或变更列
变更列的数据类型、大小或为空性
禁用视图或表的视图依赖性
当尝试进行模式变更操作时,会发生以下事件:
数据库服务器生成直接或间接依赖于所变更表或视图的视图的列表。忽略状态为 DISABLED 的视图。
如果有任何相关视图为实例化视图,请求即会失败并返回错误,剩余的事件也就不会发生。您必须显式禁用相关实例化视图,然后才能继续模式变更操作。请参见启用和禁用实例化视图。
数据库服务器获得所变更的对象以及所有相关常规视图的独占模式锁。
数据库服务器将所有相关常规视图的状态设置为 INVALID。
数据库服务器执行模式变更操作。如果操作失败,锁会被释放,相关常规视图的状态重置为 VALID,返回错误,下一步骤也不会发生。
数据库服务器重新编译相关常规视图,编译成功后将各视图的状态设置为 VALID。如果有任何常规视图的编译失败,该视图会保持 INVALID 状态。后续对 INVALID 常规视图的请求会使数据库服务器尝试重新编译该视图。如果后续尝试也失败,可能需要变更 INVALID 视图或其所依赖的对象。
常规视图可引用表或视图,包括实例化视图。
更改表或视图的模式时,数据库将自动尝试重新编译所有引用常规视图。
禁用或删除视图或表时,也自动禁用所有相关常规视图。
可以使用 ALTER TABLE 语句的 DISABLE VIEW DEPENDENCIES 子句禁用相关常规视图。
实例化视图只能引用基表。
如果有任何启用的实例化视图引用基表,则不允许更改基表模式。但是,可以向表中添加外键(例如,ALTER TABLE ADD FOREIGN KEY)。
删除表之前,必须禁用或删除所有相关实例化视图。
ALTER TABLE 语句的 DISABLE VIEW DEPENDENCIES 子句不影响实例化视图。要禁用实例化视图,则必须使用 ALTER MATERIALIZED VIEW ...DISABLE 语句来禁用每个相关实例化视图。
禁用实例化视图后,必须显式重新启用它,例如使用 ALTER MATERIALIZED VIEW ...ENABLE 语句。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |