无法在 View SQL Server 2005 上执行删除

Posted

技术标签:

【中文标题】无法在 View SQL Server 2005 上执行删除【英文标题】:Unable to perform delete on View SQL Server 2005 【发布时间】:2011-06-07 15:51:00 【问题描述】:

我无法对视图执行删除。在各个表上一切正常。

EDIT1:添加触发器

CREATE TRIGGER myTrigger
ON [ViewName]
INSTEAD OF DELETE
AS
DELETE
FROM [ViewName]
WHERE [ColumnName] < DATEADD(Day, -90, GETDATE())

在添加触发器之前出现以下错误

View or Function "blah" is not updateable because the modification affects multiple base tables>

【问题讨论】:

这条信息似乎很清楚。 添加了触发器。它执行但不删除任何东西。 @harper89 - 这是因为您需要针对适当的基表而不是视图执行删除(在触发器内) 忘掉触发器和视图,使用存储过程就可以了。 【参考方案1】:

好的,让我们想象一个会发生此错误的实例(因为您尚未显示视图定义)。

假设我们有一个视图:

CREATE VIEW dbo.V1
with schemabinding
as
    select 'T1' as TabName,T1ID as ID,ImportantDate from dbo.T1
    union all
    select 'T2',T2ID,ImportantDate from dbo.T2

我们现在是否尝试:

DELETE from dbo.V1 where ImportantDate < DATEADD(day,-90,CURRENT_TIMESTAMP)

我们会收到您显示的错误(或类似错误)。所以我们需要一个触发器:

CREATE TRIGGER T_V1_D
on dbo.V1
instead of delete
as
    set nocount on
    delete from dbo.T1 where T1ID in (select ID from deleted where TabName = 'T1')
    delete from dbo.T2 where T2ID in (select ID from deleted where TabName = 'T2')

如果没有简单的方法将deleted psuedo-table 中的行与需要从每个基表中删除的行关联起来,则此触发器的编写会变得相当复杂。

【讨论】:

谢谢。这将它们结合在一起。【参考方案2】:

删除命令:http://msdn.microsoft.com/en-us/library/ms189835.aspx

table_or_view_name 引用的视图必须是可更新的,并且在视图的 FROM 子句中只引用一个基表。有关可更新视图的详细信息,请参阅 CREATE VIEW (Transact-SQL)。

CREATE VIEW 命令,可更新视图:http://msdn.microsoft.com/en-us/library/ms187956.aspx

任何修改,包括 UPDATE、INSERT 和 DELETE 语句,都必须仅引用一个基表中的列。

【讨论】:

【参考方案3】:

您是否引用了多个表中的列? 如果是这样的话,这个错误听起来很简单。

但是,您可以使用存储过程而不是视图来执行此操作。

【讨论】:

以上是关于无法在 View SQL Server 2005 上执行删除的主要内容,如果未能解决你的问题,请参考以下文章

sql server2005 代理 无法启动

sql server 2005 安装报错

SQL Server 2005 - 无法回滚嵌套事务

sqlserver 2005服务无法启动

如何用SQL SERVER 2005连接SQL SERVER 2008

我下载SQL server 2005 在最后几布出现无法服务sql server vss write (sqlwrite) 请确认有访问权限