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)
可更新连接视图的规则如下:
一般规则
连接视图上的任何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