mysql中的可更新视图,包含多个表和计算值

时间:2009-03-16 11:32:30

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

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的视图就不够了。

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

这是正确的方法吗?

3 个答案:

答案 0 :(得分:2)

向下滚动您链接的页面,您将看到有关可更新视图的段落。您无法根据工会更新视图,以及其他限制。这背后的逻辑可能很简单,Sql Server应该如何决定哪些源表/视图应该接收更新/插入?

答案 1 :(得分:1)

您可以修改分区视图,前提是它们满足特定条件。

这些条件包括在每个表上使用partitioning column作为主键的一部分,并为分区列设置非重叠检查约束。

这似乎不是你的情况。

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

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

答案 2 :(得分:1)

如果视图基于多个基表,则视图上的UPDATE语句可能会也可能不会起作用,具体取决于UPDATE语句。如果UPDATE语句影响多个基表,则SQL Server会引发错误。然而,如果UPDATE仅影响视图中的一个基表,则UPDATE将起作用(不正确地始终)。 insert和delete语句总是会失败。

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

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