如何确定多表视图的哪些表是可更新的?

时间:2009-05-19 17:12:32

标签: sql-server database vb.net

更新:我的问题似乎与SQL服务器无关。我在数据库中手动对视图执行了一个更新语句,我能够更新Bar表。我会关闭它并研究OleDbDataAdapters,因为我认为问题在于它们。

此问题适用于MS SQL Server 2000. 如何确定可以修改多表视图的哪个表?

我有以下观点:

CREATE VIEW dbo.MyView
AS
SELECT     dbo.Foo.Id, dbo.Bar.Id, dbo.Foo.column1, dbo.Foo.column2,
           dbo.Foo.column3, dbo.Bar.column1, dbo.Bar.column2, 
           dbo.Bar.column3
FROM       dbo.Bar INNER JOIN
                  dbo.Foo ON dbo.Bar.Id = dbo.Foo.ForeignId

当我更新这个视图时,(使用VB.NET OleDbDataAdapters),我可以更新Foo的列,但不能更新Bar的列。我对此的调查告诉我,在这样的多视图中,MS SQL服务器只允许您更新其中一个表。所以我的问题是,SQL服务器如何确定哪个表可以更新?

我尝试了一个测试,我从视图中编辑特定行的字段。之后,我使用OleDbDataAdapter来更新视图。仅接受对Foo表的编辑。对Bar表的编辑被忽略(没有抛出异常)。

有没有办法预测哪些表可以更新或者控制哪一个? 如果我希望Bar成为可更新表而不是FOO?

更新:我在google上找到了这个,MS SQL Server 2000 Unleased:

http://books.google.com/books?id=G2YqBS9CQ0AC&pg=RA1-PA713&lpg=RA1-PA713&dq=ms+sql+server+ “多表+视图” ++更新&安培;源= BL&安培; OTS = ZuQXIlEPbO&安培; SIG = JbgdDe5yU73aSkxh-SLDdtMYZDs&安培; HL = EN&安培; EI = B-0SSq-aHZOitgPB38zgDQ&安培; SA = X&安培; OI = book_result&安培; CT =导致&安培; resnum = 1#PRA1-PA713,M1

(出于某种原因,我尝试粘贴的网址不适用于此网站,抱歉您必须复制并粘贴。)

其中说:

  • 通过多视图 无法 进行的更新不会影响 一个 底层基表。
  • 无法针对多视图执行删除。

但是,我还没有看到我的问题的答案。

同样,我的问题是:

如何确定可以修改多表视图的哪个表?

我意识到我可以为每个表写一个两个更新语句。我的担忧是不同的。我需要审核使用上述视图的代码并对视图进行更新。我希望找到一种方法来确定哪些部分的更新将被默默忽略。

示例:

我编辑Bar.Column1然后调用OleDbDataAdapter的Update()方法。这导致Bar表未被修改,也不会抛出异常。如果我编辑Foo.Column2然后调用Update(),Foo表会被修改。

2 个答案:

答案 0 :(得分:1)

您可以更新视图中的任何表,但只能更新该语句中同一个表中的所有字段。如果需要更新视图中两个表的字段,则必须编写两个更新语句。

就我个人而言,我根本不想更新或删除视图。我使用基表。

还有关于视图是否可更新的规则。在线查看图书。搜索: views-SQL Server,修改数据

答案 1 :(得分:-1)

您需要能够通过返回主键来唯一标识表中的行。尝试在视图中返回dbo.Bar.Id,您应该可以编辑表Bar中的列。