当 base table 获得附加字段时,如何防止视图中的内部字段偏移?

How to prevent internal field shift in views when base table gets additional fields?

今天我们的 MS SQL 服务器数据库视图中出现了一个有趣的问题。

有几个碱基table。一个是 sys_user,另一个加入了一些额外的数据。

SQL 视图定义的(开头)如下所示:

ALTER VIEW [dbo].[V_Usage] AS
SELECT u.*,
    case when assexcl.sys_id IS NULL THEN asslookup.home_office ELSE assexcl.home_office END [Home Office],
    case when assexcl.sys_id IS NULL THEN asslookup.assigned_group ELSE assexcl.assigned_group END [Assigned Group],
    case when assexcl.sys_id IS NULL THEN asslookup.drs_hub ELSE assexcl.drs_hub END [DRS Hub],
  x.request_sys_id, x.request_pa_name, x.u_allocation request_allocation, x.u_negotiated_deadline, x.u_research_time, x.u_qa_time_drs, x.u_assignment_group, x.u_utilization_category
FROM sys_user u
    LEFT outer join (...

select u.* 引入了sys_user table 的所有字段,另外一些字段也按用户显示,在下方查询。

在 sys_user table 中添加一个字段后,我们遇到了最后一个字段中的所有内容都向右移动一列的问题。

[Home Office] 确实包含 sys_user table 的最后一个字段, [Assigned Group]确实包含了[Home Office]的内容 等等

首先我想了解一下这个问题。我认为这是由于内部编译和引用。

其次,我希望有一个解决方案来避免这种情况再次发生。我不希望直接在视图中引用所有字段,因为所有 sys_user 字段都应该在视图中是有意的。

是否有一种标志或数据库提示来保持这些视图的正确性,即使在基础 tables 添加字段时也是如此?

感谢任何信息。

只是不要使用 u.*。这通常不是一个好的做法,您现在遇到的问题是原因之一。

选择 * 时,没有 "automagical" 解决方案可以让您 保持这些视图正确,即使在基表添加字段时也是如此

相反,您应该在 select 子句中枚举要从 sys_user 中选择的所有列。这样,您就可以控制在视图中显示哪些列,以及显示的顺序。

添加新列时,您可以修改视图的定义以将它们添加到您喜欢的位置。

我花了很多很多时间(从前)调试由此类查询引起的问题,我强烈建议您永远不要在视图中使用 *

也就是说,您可以使用 SCHEMABINDING.

来防止对基础 table 的更改

Binds the view to the schema of the underlying table or tables. When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition.

如文档所述,这会阻止对其他 table 的更改 ,除非重新创建视图。它不会自动更改视图,但会防止发生破坏性更改。

您还可以调查为什么 table 结构在生产数据库中发生变化——大概是这样。这似乎是一个糟糕的设计。