【问题标题】:Updateable view in mssql with multiple tables and computed valuesmysql 中具有多个表和计算值的可更新视图
【发布时间】:2009-03-16 11:32:30
【问题描述】:

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

我想为所有这些表创建一个视图,这样使用这种数据灾难的新代码就不需要了解所有不同的媒体表。我还想将此视图用于插入和更新语句。显然,旧代码仍将依赖表来保持最新状态。

在阅读了关于 creating views in mssql2005 的 msdn 页面后,我认为使用 SCHEMABINDING 的视图是不够的。

如何创建这样一个可更新的视图?

这是正确的方法吗?

【问题讨论】:

    标签: sql-server database sql-server-2005 union


    【解决方案1】:

    在您链接的页面上向下滚动,您会看到有关可更新视图的段落。除其他限制外,您不能基于联合更新视图。这背后的逻辑可能很简单,Sql Server 应该如何决定哪个源表/视图应该接收更新/插入?

    【讨论】:

    • 您实际上可以根据 UNION 更新视图,前提是它们包含一个分区列,该列将标识您正在更新的表。
    【解决方案2】:

    只要满足特定条件,您就可以修改分区视图。

    这些条件包括将partitioning column 作为每个表的主键的一部分,以及对分区列设置非重叠检查约束。

    这似乎不是你的情况。

    根据您的情况,您可以执行以下任一操作:

    • 将您的表重新创建为视图(带有计算列)以使您的旧软件正常工作,并从新软件中引用整个表
    • 使用INSTEAD OF 触发器更新表。

    【讨论】:

      【解决方案3】:

      如果一个视图基于多个基表,则视图上的 UPDATE 语句可能会或可能不会工作,具体取决于 UPDATE 语句。如果 UPDATE 语句影响多个基表,SQL Server 会抛出错误。然而,如果 UPDATE 仅影响视图中的一个基表,则 UPDATE 将起作用(并非总是正确)。插入和删除语句总是会失败。

      INSTEAD OF 触发器用于从基于多个基表的视图中正确更新、插入和删除。以下链接包含示例以及相同的视频教程。

      INSTEAD OF INSERT Trigger
      INSTEAD OF UPDATE Trigger
      INSTEAD OF DELETE Trigger

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        相关资源
        最近更新 更多