为不存在的表创建视图

Posted

技术标签:

【中文标题】为不存在的表创建视图【英文标题】:Create view to non-existent table 【发布时间】:2013-09-23 09:17:31 【问题描述】:

有没有办法在数据库中创建一个链接到不存在的表的视图?

我们刚刚发现一个数据导入例程已经失败了一段时间,因为相当大的升级意外删除了一个视图。

视图(在我们产品的数据库中,托管在客户端服务器上)链接到我们的一个客户数据库中的一个表,并由我们的客户为此目的创建。

此视图的意外删除是由于数据库更改的数量(包括视图的创建和删除),而 SQL 比较工具将删除特定于客户端的视图这一事实被遗漏了。

因此,能够在我们的本地开发数据库上创建此视图的副本将非常有用(具有客户端表的完整限定名称,我们显然无法在实时环境之外访问)所以这不会再发生了。

(有问题的客户正在运行 SQL Server 2008,但该产品也可以在 2005 环境中为其他客户运行。因此,最好选择 2005 的答案,但如果它是 2008 特定的,那不是问题.)


更新:

回复@Damien 的评论...

我明白你在说什么,在视图中创建一个链接到的空表会很有意义。

不幸的是,有问题的表不仅托管在不同的数据库中,而且托管在不同的 SQL 服务器上。这意味着我将在我们所有的开发机器上创建一个新的服务器实例,以便托管这个单一的空表。而且我必须在我们的许多客户端上执行此操作,从而导致大量实际上未使用的服务器实例。

我真的希望能够避免这种情况,而是能够创建视图(这在我们的开发环境中显然会失败),但将来不会再次被意外删除。


更新 2

我已经接受了@Damien 所说的内容并使用Linked Server 实现了这一点...有关更多详细信息,请参阅我的答案

【问题讨论】:

为什么不能创建这些表的(空)副本? 因为,@Damien,这将涉及创建一个新的服务器实例、一个新的数据库和一个新的表......所有这些我都不是特别热衷于为此做的。我希望在创建时有某种“覆盖”命令,它告诉 SQL Server“不要费心检查它是否存在,只要假设它存在”。我猜不是,但我只是希望 这个问题没有很好的解决方案,但是您可以在本地 VIEW 中注释“FROM”部分并将字段值设为 NULL(例如“SELECT NULL AS ClientField1, NULL AS ClientField2, etc /*FROM foo */ WHERE ClientField1 > X ORDER BY ClientField2",或者,更难看的是,创建一个名称中带有点的表,并在本地系统中引用该表(如名称为“ClientPC.dbo.ClientTableName”的表,并在视图中引用此内容。不要将其发布为答案,因为可能有更好的解决方案,但遗憾的是我不知道。 谢谢@Mark,我就是这么想的。我已经设法拼凑出一些东西,我已经把它作为答案......除非有人想出更好的主意 【参考方案1】:

正如@Mark 在his comment under my question 中所说,使用view 似乎无法做到这一点。 (stored procedures 存在“延迟名称解析”,但views 不存在)。

我解决它的方法是大致遵循@Damien's suggestion,在我的开发机器上创建一个新实例,该实例纯粹用于这些“特定于客户端的空表”。

然后我为这个新实例创建了一个 Linked Server 对象,并使用客户端服务器名称的别名(使用 this answer on SO 来创建 Linked Server 对象),并在实例中创建了适当命名的数据库和适当命名的表。

此新实例的服务已设置为手动启动,因此它不应该占用资源 - 我可以在必要时启动并运行它,以应对未来的任何工作。

结果是我现在在我的开发数据库中有问题的view,并且它与我们客户端数据库中的view 完全“比较”......所以它永远不会(理论上)作为一部分被删除再次升级。

【讨论】:

以上是关于为不存在的表创建视图的主要内容,如果未能解决你的问题,请参考以下文章

为不存在的表 slick scala (Slick 3.0.0, scala) 创建一个类 Table

6.mysql视图

我可以在视图中查询数据库中的表(仅当它存在时)?

表视图内的表视图

mysql 视图

ORA-00942: 使用 iBatis 的表或视图不存在