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

时间:2011-06-07 15:51:00

标签: sql sql-server sql-server-2005

我无法在View上执行删除操作。各个表格上的一切都很好。

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>

3 个答案:

答案 0 :(得分:1)

删除命令: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语句)都必须仅引用一个基表中的列。

答案 1 :(得分: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伪表中的行,那么这个触发器的编写要复杂得多。

答案 2 :(得分:0)

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

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