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触发

scroll top