带有连接表的SQL可更新视图

Red*_*Taz 15 sql-server view sql-view sql-update

我有一个看起来与此相似的观点,

SELECT  dbo.Staff.StaffId, dbo.Staff.StaffName, dbo.StaffPreferences.filter_type
FROM    dbo.Staff LEFT OUTER JOIN
        dbo.StaffPreferences ON dbo.Staff.StaffId = dbo.StaffPreferences.StaffId
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新StaffPreferences.filter_type使用,

UPDATE vw_Staff SET filter_type=1 WHERE StaffId=25
Run Code Online (Sandbox Code Playgroud)

我在MSDN文章中读过这篇文章,

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

这是否意味着我只能更新dbo.Staff中的字段(这是我当前可以实现的)在这个上下文中,'base table'的定义是否扩展到任何后续连接的表?

编辑:这是MS SQL

Mik*_*son 14

您的语句应该可以正常工作,因为您只修改一个表(StaffPreferences)中的列.

如果您尝试从同一更新语句中的不同表更新列,则会出现错误.

Msg 4405, Level 16, State 1, Line 7
View or function 'v_ViewName' is not updatable because the modification affects multiple base tables.
Run Code Online (Sandbox Code Playgroud)


Nat*_*n Q 5

可更新连接视图的规则如下:

一般规则

连接视图上的任何INSERT,UPDATE或DELETE操作一次只能修改一个基础基表.

UPDATE规则 连接视图的所有可更新列都必须映射到密钥保留表的列.有关密钥保留表的讨论,请参阅"密钥保留表".如果使用WITH CHECK OPTION子句定义视图,则所有连接列和重复表的所有列都是不可更新的.

删除规则

只要连接中只有一个密钥保留表,就可以删除连接视图中的行.如果使用WITH CHECK OPTION子句定义视图并重复密钥保留表,则无法从视图中删除行.

INSERT规则 INSERT语句不能显式或隐式引用非键保留表的列.如果使用WITH CHECK OPTION子句定义连接视图,则不允许INSERT语句.

http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/views.htm#391