我希望在表格中有两列来存储添加时间和更新时间。顾名思义,添加时间是首次添加行的时间;更新时间是更新行的最后时间。我可以先通过默认值GETDATE()
来实现。至于第二个,@ Jeremy建议在这里使用触发器:
On Update: Auto Update Date/Time Field
UPDATE
语句(或者一个INSERT
和一个UPDATE
,以防刚刚创建该行)?感谢。
编辑:对于问题的第二部分,这是我在数据库中的触发器:
CREATE TRIGGER [dbo].[TR_AddUpdateTime]
ON [dbo].[AddUpdateTime]
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
UPDATE r
SET UpdateTime = GETDATE()
FROM AddUpdateTime r
JOIN inserted i
ON i.Id = r.Id
END
这是否意味着每当我对AddUpdateTime表进行更新时都会执行额外的更新语句,或者MSSQL是否足够智能以识别我正在更新同一记录并同时保存这两个更改?
答案 0 :(得分:2)
编辑:对于实体框架,您可以实现OnSavingChanges事件以插入更新时字段(see here)吗?这将责任从数据库转移到您可能会或可能不习惯的代码。
答案 1 :(得分:2)
其他方式:
UPDATE MyTable SET ..., UpdatedWhen = DEFAULT...
您需要一个UPDATE触发器,它本身还有一个UPDATE。使用表上的默认值意味着您不需要INSERT
答案 2 :(得分:1)
以下是a link,其中显示了如何使用Entity Framework执行此操作。
答案 3 :(得分:1)
在实体框架中,您可以使用partial类来扩展业务逻辑。在这种情况下,您可以使用 OnPropertyChanged 将更新时间设置为DateTime.Now。您可以使用此article on MSDN作为指导。
答案 4 :(得分:0)
1)“自动更新”和“触发器”听起来并不像是要走的路。
2)SQL Server有一个(相对较新的)“merge”语句。但这听起来并不像你想要的那样。
3)相反:
a)如果主键不存在(如果是“new”),则INSERT。在这种情况下,第一次=最后一次= GETDATE()。
b)否则,如果主键已存在,则UPDATE。您的更新将仅更新“上次”列(以及您需要为此记录更新的其他字段。
4)也许您可以将此逻辑包装在存储过程中?
5)再次 - 关键是更新 BOTH “第一次”和“上次*,第一次,然后再更新 “上次”所有SUBSEQUENT次。
答案 5 :(得分:0)
它们可能是一种更简单的方法,但是使用触发器会更有效,并且无法保证记录是如何记录或更新的(从.net代码或直接表插入/更新),这两个字段是填充的
保证每次只触发一个触发器,组合插入和更新触发器
CREATE TRIGGER <trigger name> ON TableA for INSERT,UPDATE
并进行条件检查以区分两个动作
IF UPDATE