mssql 中具有多个表和计算值的可更新视图
-
19-08-2019 - |
题
mssql2005 中的庞大数据库具有庞大的代码库,具体取决于该数据库的结构。
我有大约 10 个类似的表,它们都包含文件名或文件的完整路径。完整路径始终取决于项目 ID,因此将其存储在数据库中没有意义。从这些表中获取有用的数据有点像这样:
SELECT a.item_id
, a.filename
FROM (
SELECT id_item AS item_id
, path AS filename
FROM xMedia
UNION ALL
-- media_path has a different collation
SELECT item_id AS item_id
, (media_path COLLATE SQL_Latin1_General_CP1_CI_AS) AS filename
FROM yMedia
UNION ALL
-- fullPath contains more than just the filename
SELECT itemId AS item_id
, RIGHT(fullPath, CHARINDEX('/', REVERSE(fullPath))-1) AS filename
FROM zMedia
-- real database has over 10 of these tables
) a
我想创建所有这些表的单个视图,以便使用此数据灾难的新代码不需要了解所有不同的媒体表。我还想使用这个视图来插入和更新语句。显然旧代码仍然依赖于表来更新。
阅读了有关的 msdn 页面后 在mssql2005中创建视图 我认为使用 SCHEMABINDING 的视图还不够。
我将如何创建这样一个可更新的视图?
这是正确的方法吗?
解决方案
您可以修改分区视图,只要它们满足某些条件。
这些条件包括拥有 partitioning column
作为每个表上主键的一部分,并为分区列设置一组非重叠检查约束。
这似乎不是你的情况。
对于您的情况,您可以执行以下任一操作:
- 将表重新创建为视图(带有计算列),以便旧软件可以工作,并引用新软件中的整个表
- 使用
INSTEAD OF
触发器来更新表。
其他提示
向下滚动你的链接页面上,你会看到一个关于可更新视图款。你不能更新基于工会视图,除其他限制。这背后的逻辑可能是简单的,则SQL Server应该如何在什么源表/视图决定应接收更新/插入?
如果一个视图是基于多个基本表,在视图UPDATE语句可以或可以不依赖于UPDATE语句工作。如果UPDATE语句影响多个基表,SQL Server将引发一个错误。然而,如果更新影响的观点只有一个基表,然后更新将正常工作(不总是正确)。插入和删除语句总是会失败。
而不是触发器,用来正确地更新,插入,并从基于多个基本表的视图DELETE。以下链接具有实例与同一个视频教程沿。
INSTEAD OF INSERT触发结果 INSTEAD Update触发器一>点击 INSTEAD OF DELETE触发一>