无法在 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 SERVER 2005连接SQL SERVER 2008
我下载SQL server 2005 在最后几布出现无法服务sql server vss write (sqlwrite) 请确认有访问权限