在分区视图中修改数据

如果分区视图不可更新,则它只能作为原始表的只读副本。可更新的分区视图可提供原始表的所有功能。

当视图是一组 SELECT 语句,这些语句各自的结果集使用 UNION ALL 语句合并在一起时,该视图被视为可更新的分区视图。每个 SELECT 语句引用一个 SQL Server 基表。该表可以是本地表,也可以是使用由四部分组成的名称、OPENROWSET 函数或 OPENDATASOURCE 函数引用的链接表(不能使用指定了直接传递查询的 OPENDATASOURCE 或 OPENROWSET 函数)。

此外,引用该视图的数据修改语句必须遵守为 INSERT、UPDATE 和 DELETE 语句定义的规则。

注意注意

bcp 命令、BULK INSERT 语句或 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句不支持向分区视图中进行大容量导入。但是,您可以使用 INSERT 语句在分区视图中插入多个行。

如果分区视图分布在多个服务器中,应避免对基表使用触发器或级联操作。触发器或级联操作可能会更改基础数据,这将影响视图定义。

只有当用户对视图下的每个表都具有 CONTROL、ALTER、TAKE OWNERSHIP 或 VIEW DEFINITION 权限时,才能更新分布式分区视图。有关详细信息,请参阅分布式分区视图元数据可见性故障排除

注意注意

仅当安装有 SQL Server 2008 Enterprise 或 SQL Server 2008 Developer 时才能通过分布式分区视图修改数据。但是,在 SQL Server 2008 的所有版本中都可以通过本地分区视图修改数据。

INSERT 语句

INSERT 语句通过分区视图将数据添加到成员表中。INSERT 语句必须遵循下列规则:

  • 所有列必须包含在 INSERT 语句中,即使列在基表中可能为 NULL 或列在基表中定义了 DEFAULT 约束。

  • 不能在 INSERT 语句的 VALUES 子句中指定 DEFAULT 关键字。

  • INSERT 语句提供的值必须符合在一个成员表的分区列上定义的 CHECK 约束逻辑。

  • 如果一个成员表包含具有标识属性的列,则不能使用 INSERT 语句。

  • 如果成员表包含 timestamp 列,则不能使用 INSERT 语句。

  • 如果存在与同一视图或任意成员表的自联接,则不能使用 INSERT 语句。

UPDATE 语句

UPDATE 语句通过分区视图在一个或多个成员表中修改数据。UPDATE 语句必须遵循下列规则:

  • UPDATE 语句不能将 DEFAULT 关键字指定为 SET 子句中的值,即使列在相应的成员表中定义了 DEFAULT 值。

  • 不能更改带有标识属性的列的值,但是可以更新其他列。

  • 如果列包含 text、image 或 ntext 数据,则不能更改 PRIMARY KEY 的值。

  • 如果基表包含 timestamp 列,则不能进行更新。

  • 如果存在与同一视图或任意成员表的自联接,则不能进行更新。

DELETE 语句

DELETE 语句通过分区视图在一个或多个成员表中删除数据。如果存在与同一视图或任意成员表的自联接,则不能使用 DELETE 语句。