SQL表中的创建日期列
自动在SQL数据表中用行的创建日期填充datetime列的最简单方法是什么?如果有必要,请使用SQL Server 2005 编辑:我尝试使用GETDATE()作为默认值,这适用于插入查询,但在TableAdapter添加行时无效。使用SQL表中的创建日期列,sql,vb.net,sql-server-2005,datetime,Sql,Vb.net,Sql Server 2005,Datetime,自动在SQL数据表中用行的创建日期填充datetime列的最简单方法是什么?如果有必要,请使用SQL Server 2005 编辑:我尝试使用GETDATE()作为默认值,这适用于插入查询,但在TableAdapter添加行时无效。使用GETDATE()函数 例如:将data1、data2、getdate()插入表1为其设置一个默认值: ALTER TABLE table ADD column NOT NULL DEFAULT (GETDATE()) CREATE TABLE dbo.Your
GETDATE()
函数
例如:
将data1、data2、getdate()插入表1
为其设置一个默认值:
ALTER TABLE table
ADD column NOT NULL DEFAULT (GETDATE())
CREATE TABLE dbo.YourTable
(
columns....,
YourDateTime datetime NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.YourTable ADD CONSTRAINT
DF_YourTable_YourDateTime DEFAULT GETDATE() FOR YourDateTime
插入时,不要列出该列:
INSERT INTO dbo.YourTable (columns...) VALUES (values...)
或者在插入该列但使用默认关键字时:
INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,DEFAULT)
或者在插入该列并使用GETDATE()或其他日期时间时:
INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,'1/1/2010 12:34:56')
您应该创建列并具有:
- 将其设置为当前日期(或日期/时间)的insert(after)触发器
- 不允许更改列的更新(而不是)触发器
任何默认值解决方案都是不安全的,因为在插入或更改列时,可以通过专门设置列来绕过它。基于触发器的解决方案将控件放在它所属的DBMS中。如果使用复制,请小心。我不熟悉SQL Server复制的内部细节,但我知道,对于某些形式的MySQL复制,如果使用NOW()作为默认值,或者使用相同的函数使用触发器,则发布服务器和订阅服务器数据库之间的日期将不同 如果在应用程序中设置了日期,则该日期始终可以正常复制。当然,需要注意的是,应该从应用程序(或web)服务器设置日期或时间,因为最终用户机器上的日期和时间不可信
如果您使用的是复制,您可能需要对此进行测试。正如您所看到的,前面有多种解决方案。总之,
(请考虑代码在我的头上。为了语法目的,可能需要一些修复。这至少给了你主要的想法。)
正如paxdiablo对自己答案的评论中所述,应在DBMS端处理此类功能,以避免应用程序客户端的数据损坏。那么,我打赌您的更好选择可能是2.,创建一个BEFORE INSERT触发器并使用GETDATE()函数设置其中的值。在其他数据库引擎中,这可能是
SYSDATE
或NOW()
而不是GETDATE()
。您的意思是要向后填充它吗?与今天一样,您希望为过去添加的所有行填写创建日期吗?还是继续前进?继续前进就好了。应用程序尚未部署。这是因为表适配器正在输入值。仅当从插入中完全排除该列时,默认设置才起作用。您可以使用Now在VB中自己填充该值,或者让DB使用触发器来处理该值。这是我最初尝试的方法,但不起作用,我现在怀疑是因为VB.NET在未指定任何内容时插入0而不是NULL。@MatsT:NULL无法发信号给数据库插入列的默认值。如果要在插入时指定默认值,则必须执行以下操作:insert-INTO-member(lastname,firstname,membership\u-date)值('lennon','john',default)
不幸的是,您无法执行:insert-INTO-member(lastname,firstname,membership\u-date)值(@paramFromYourVb,default))
Correct,您不包括要设置为默认值的列。因为您不能使null参与函数或表达式。试着在SQLServer中创建一个UDF,就像我在这里建议的那样:为什么要投否决票?我认为这是正确的答案,因为它不存在默认值的可审计性问题。我很想听听你为什么认为它不正确的理由。我没有否决投票,但用户无法控制应用程序中的值。我不理解你的评论,@Marcus。如果你想让一行保留其创建日期,用户不应该有控制权,DBMS应该有。@Marcus:paxdiablo的解决方案从不在应用程序中,而是在奖牌的DBMS端。不,恐怕我不得不强烈反对这一评论,@Marcus。您永远不会依赖客户机代码的良好行为。这是因为你永远不知道是否有人会在一个不遵守你的规则的恶意客户端中溜走。DBMS应保持其自身的完整性。典型的例子是JDBC。任何猴子都可以编写Java JDBC应用程序,它可以连接到您的数据库并打破规则。如果规则在DBMS上强制执行,则这是不可能的。另一个经典是操作系统——你不会因为告诉应用程序不要做坏事就让它不安全。
Public Function InsertObject(o As Object) As Integer
cmd.CommandText = String.Format("INSERT INTO table_name (Id, CreationDate) VALUES (1, {0})", System.DateTime.Now)
Return cmd.ExecuteNonQuery()
End Function
CREATE TRIGGER trg_bi_PersistObject
ON objectToPersistTable
INSTEAD OF INSERT AS
insert into objectToPersistTable (Id, CreationDate) (
select Id, GETDATE()
from inserted
)