6

我在 SQL Server 中有一个现有表,其中包含现有条目(实际上超过 100 万个)。

该表由前端应用程序定期更新、插入和选择。我想要/需要添加一个datetime列,例如M_DateModified可以像这样更新:

UPDATE Table SET M_DateModified = GETDATE()

每当在前端按下按钮并调用存储过程时。此列将根据要求添加到现有报告中。

我的问题,答案是这样的。作为我们应用程序的核心表之一,ALTERING该表和添加额外的列会破坏其他现有查询吗?显然,如果不为所有列指定所有值,则无法插入表中,因此任何现有INSERT查询都会中断(这是一个大问题)。

任何有关此问题的最佳解决方案的帮助将不胜感激。

4

4 回答 4

6

首先,正如 marc_s 所说,它应该只影响SELECT *查询,甚至不一定会影响所有查询。

其次,您只需要在 上指定所有非 Null字段INSERT,因此如果您使其可以为 NULL,则不必担心这一点。此外,对于Created_Date-type 列,通常添加一个DEFAULT设置=GetDate(),如果未指定,它将为您填充。

第三,如果您仍然担心影响现有代码库,请执行以下操作:

  1. 将您的表重命名为“physicalTable”之类的名称。
  2. 创建一个与您的表以前具有相同名称的视图,它执行 a SELECT .. FROM physicalTable,以相同的顺序显式列出列,但不包括其中的M_DateModified字段。
  3. 保持代码不变,现在引用视图,而不是直接访问表。

现在您的代码可以安全地与表交互而无需任何更改(SQL DML 代码无法区分 Table 和这样的可写视图之间的区别)。

最后,这种“ModifiedDate”列是一种常见的需求并且最常被处理,首先通过使其可以为 NULL,然后添加一个自动设置它的插入和更新触发器:

UPDATE t
SET    M_DateModified = GetDate()
FROM   (SELECT * FROM physicalTable y JOIN inserted i ON y.PkId = i.PkId) As t

这样应用程序就不必维护字段本身。作为额外的好处,应用程序也不能错误地或错误地设置它(这是 SQL 中触发器的常见且可接受的用法)。

于 2013-08-12T13:52:06.993 回答
1

取决于您的其他查询的设置方式。如果他们是SELECT [Item1], [Item2], ect……那么您将不会遇到任何问题。如果是,SELECT * FROM那么您可能会遇到一些意想不到的结果。

请记住您要如何设置它,您要么必须将其设置为可为空的,这可能会让您适应未来,要么设置默认日期,这可能会给您提供不正确的数据以进行报告、检索、查询,等等。。

于 2013-08-12T13:49:41.113 回答
1

如果新列不是强制性的,您无需担心。除非您有一些笨蛋用“*”而不是列列表编写选择语句。

于 2013-08-12T13:48:10.280 回答
1

好吧,只要您的 SELECT 不是 *,那应该没问题。对于 INSERT,如果您为该字段提供默认的 GETDATE() 并允许 NULL,您可以将其排除在外,它仍将被填充。

于 2013-08-12T13:48:52.933 回答