【问题标题】:How do you update a datetime field in a table every time another field in the same table gets updated?每次更新同一表中的另一个字段时,如何更新表中的日期时间字段?
【发布时间】:2015-02-26 20:30:47
【问题描述】:

我有一个名为 YearTable 的表,其中包含三列(Year、Status 和 LastUpdatedTime)。每次有人将值添加/更新到年份或状态列 LastUpdatedTime 时都需要更新。我为此编写了一个触发器,但现在每次尝试添加新记录时都会收到一条错误消息:

错误源:.NetSqlClient 数据提供程序。 错误消息:无法将值 NULL 插入到列“Year”、表“Budget.YearTable”中;列不允许空值。插入失败。

这是触发器:

CREATE TRIGGER UpdateTrigger
ON  YearTable
AFTER INSERT,DELETE,UPDATE
AS 
BEGIN

insert into tblaudit(LastUpdatedTime)
values(GETDATE())

END
GO

【问题讨论】:

  • 代码没有正确复制:
  • ALTER TRIGGER [dbo].[UpdateTrigger] ON [dbo].[YearTable] 在插入、删除、更新开始后插入 YearTable(LastUpdatedTime) 值(GETDATE()) END
  • 您的触发器是插入到YearTable 还是tblAudit 表中?您在问题中列出了一个,而在评论中列出了另一个...
  • 是的,我注意到了,我在 cmets 中修复了它。

标签: sql sql-server triggers


【解决方案1】:

你说:

我为此编写了一个触发器,但现在每次尝试添加新记录时都会收到一条错误消息:

错误源:.NetSqlClient 数据提供程序。错误消息:无法将值 NULL 插入到列“Year”、表“Budget.YearTable”中;列不允许空值。插入失败。

由此可见,这是否意味着您的updatesdeletes 工作正常?如果是这种情况,那么听起来就像错误消息状态一样。当您在表中执行insert 时,您没有为YearTable 上的year 列提供值。

您是否尝试过禁用触发器并查看执行相同操作时是否存在行为?

在进一步考虑您的问题后,我现在假设您的意思是,当 YearTable 中的一行更新时,@ 中的同一行987654327@ 的LastUpdated 列已更新。虽然现在我不确定你的tblAudit 来自哪里。或者为什么您要为 deletes 创建触发器,而此时没有要更新的行。

我假设您在桌子上的钥匙是year - 如果您目前没有钥匙,您可能需要一把。

要处理插入/更新的LastUpdated,您可以在触发器中使用以下内容(假设年份是您的关键):

UPDATE YearTable
SET LastUpdated = GetDate()
FROM inserted
where YearTable.Year = inserted.year

【讨论】:

  • 是的,tblAudit 是个错误。我在评论部分修复了表名。谢谢您的帮助。这解决了我的问题。
  • 没问题,你可以在以后编辑问题来修正这个错误:)
  • 您知道如何更新它以添加更新者的用户名(使用 Windows 身份验证)吗?
  • 触发器如何访问这些信息?您需要将用户名作为所有更新/插入的一部分传递以记录用户名,据我所知,它无法在触发器中处理
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2011-02-15
相关资源
最近更新 更多