将列添加到现有SQL Server表 - 含义

fra*_*ans 6 c# sql sql-server asp.net

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

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

UPDATE Table SET M_DateModified = GETDATE()
Run Code Online (Sandbox Code Playgroud)

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

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

对于这个问题的最佳解决方案,将非常感谢任何帮助.

RBa*_*ung 6

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

其次,你只需要指定一个非Null字段INSERT,所以如果你使它成为NULL,你就不必担心了.此外,对于a- Created_Datetype列,通常会添加一个DEFAULT设置=GetDate(),如果未指定,将为其填充.

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

  1. 将表重命名为"physicalTable".
  2. 创建一个与您的表格具有相同名称的视图,该SELECT .. FROM physicalTable列表以明确且相同的顺序列出列,但不包括其中的M_DateModified字段.
  3. 保持代码不被修改,现在引用View,而不是直接访问表.

现在,您的代码可以安全地与表进行交互而无需任何更改(SQL DML代码无法区分Table和可写的View之间的区别).

最后,这种"ModifiedDate"列是一种常见的需求,并且通常通过使其为NULL来处理,然后通过添加自动设置它的Insert&Update触发器来处理:

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

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