更新:我的问题似乎与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表会被修改。
答案 0 :(得分:1)
您可以更新视图中的任何表,但只能更新该语句中同一个表中的所有字段。如果需要更新视图中两个表的字段,则必须编写两个更新语句。
就我个人而言,我根本不想更新或删除视图。我使用基表。
还有关于视图是否可更新的规则。在线查看图书。搜索: views-SQL Server,修改数据
答案 1 :(得分:-1)
您需要能够通过返回主键来唯一标识表中的行。尝试在视图中返回dbo.Bar.Id
,您应该可以编辑表Bar
中的列。