我有一些带有“创建”和“修改”日期的表。如果应用层未提供修改日期,我只想更新后者。我们需要让应用层能够在离线交易(例如稍后同步设备无法连接互联网)发生时将修改日期设置为特定值,但我们不能保证每个应用程序开发人员都会记得在应用程序代码中设置修改日期。
给定以下表:
最后:
给定以下表:
CREATE TABLE [dbo].[Tests](
[TestID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[CreatedDate] [datetime2](7) NOT NULL,
[ModifiedDate] [datetime2](7) NOT NULL,
CONSTRAINT [PK_Tests] PRIMARY KEY CLUSTERED
(
[TestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Tests] ADD CONSTRAINT [DF_Tests_CreatedDate] DEFAULT (getutcdate()) FOR [CreatedDate]
GO
ALTER TABLE [dbo].[Tests] ADD CONSTRAINT [DF_Tests_ModifiedDate] DEFAULT (getutcdate()) FOR [ModifiedDate]
GO
似乎当更新中没有提供“修改日期”时,它不会执行更新或抛出异常,而是保持不变。
示例测试用例:
生成的 LINQ-to-Entities 代码:
exec sp_executesql N'update [dbo].[Tests]
set [Name] = @0
where ([TestID] = @1)
',N'@0 nvarchar(50),@1 int',@0=N'Test_635267931494843908',@1=3
应该将修改日期更新为GETUTCDATE()
SQL代码:
UPDATE Tests
SET Name = 'Test' + CONVERT(nvarchar(255), NEWID())
WHERE TestID =3
应更新修改日期为GETUTCDATE()
带有修改日期的SQL代码:
UPDATE Tests
SET Name = 'Test' + CONVERT(nvarchar(255), NEWID()),
ModifiedDate = '2014-01-31 19:10:48'
WHERE TestID =3
应将修改日期更新为“2014-01-31 19:10:48”
我尝试了以下操作:
CREATE TRIGGER
[dbo].[ModifiedDateUpdateTrigger]
ON
[dbo].[Tests]
AFTER UPDATE
AS
BEGIN
UPDATE dbo.Tests
SET ModifiedDate = GETUTCDATE()
FROM dbo.Tests as t
INNER JOIN inserted as i on i.TestID = t.TestID
INNER JOIN deleted as d on d.TestID = t.TestID
WHERE t.ModifiedDate <> i.ModifiedDate
AND d.ModifiedDate <> i.ModifiedDate
END
并且
CREATE TRIGGER
[dbo].[ModifiedDateUpdateTrigger]
ON
[dbo].[Tests]
FOR UPDATE
AS
BEGIN
DECLARE @m datetime2(7) = (select MODIFIEDDATE FROM inserted)
print @m
IF (select MODIFIEDDATE FROM inserted) IS NULL
BEGIN
RETURN
END
UPDATE dbo.Tests
SET ModifiedDate = GETUTCDATE()
FROM INSERTED i
WHERE i.TestID = Tests.TestID
END
最后:
CREATE TRIGGER
[dbo].[ModifiedDateUpdateTrigger]
ON
[dbo].[Tests]
FOR UPDATE
AS
BEGIN
DECLARE @m datetime2(7) = (select MODIFIEDDATE FROM inserted)
print @m
IF (select MODIFIEDDATE FROM inserted) <> (SELECT i.ModifiedDate FROM Tests as t INNER JOIN inserted as i on t.TestID = i.TestID)
BEGIN
RETURN
END
UPDATE dbo.Tests
SET ModifiedDate = GETUTCDATE()
FROM INSERTED i
WHERE i.TestID = Tests.TestID
END
这些方法都不能满足所有测试用例的要求。
inserted
值是否相同,因为它没有被传递,或者因为上次传递了相同的值。我会再考虑一下的。 - Aaron Bertrand