0

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

我想创建所有这些表的单一视图,以便使用此数据灾难的新代码不需要了解所有不同的媒体表。我还想将此视图用于插入和更新语句。显然,旧代码仍将依赖表来更新。

在阅读了有关在 mssql2005 中创建视图的 msdn 页面后,我认为使用 SCHEMABINDING 的视图就足够了。

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

这是正确的方法吗?

4

3 回答 3

2

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

于 2009-03-16T11:43:10.757 回答
1

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

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

这似乎不是你的情况。

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

  • 将您的表重新创建为视图(带有计算列)以使您的旧软件工作,并从新软件中引用整个表
  • 使用INSTEAD OF触发器更新表。
于 2009-03-16T12:05:04.870 回答
1

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

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

INSTEAD OF INSERT 触发器
INSTEAD OF UPDATE 触发器
INSTEAD OF DELETE 触发器

于 2012-09-24T15:03:56.407 回答