我必须添加一个触发器,该触发器应使用以下格式字符串更新列:<current_date>_<per_day_incremental_id>
,例如2015-10-01_36
。ID必须是递增的,并且允许有空格。
我的方法很幼稚:用当前日期和当前序列值创建一个表,并在其中保留一条记录:
create table DailySequence
(
date date,
sequence int
)
insert into DailySequence values (getdate(), 1);
CREATE TRIGGER MakeHumanReadableId ON dbo.AuditMeasures
FOR INSERT
AS
DECLARE @ret int;
DECLARE @tempDate date;
DECLARE @nowDate date;
SET @nowDate = getdate();
SELECT @ret = t.sequence, @tempDate = t.date from DailySequence as t;
IF @nowDate = @tempDate
BEGIN
SET @ret = @ret + 1;
UPDATE DailySequence
SET sequence = @ret;
END
ELSE
BEGIN
SET @ret = 0;
UPDATE DailySequence
SET sequence = @ret, date = @nowDate;
END
UPDATE AuditMeasures
SET [HumanReadableId] = CAST(@nowdate AS VARCHAR(10)) + '_' + CAST(@ret AS VARCHAR(10));
FROM inserted
INNER JOIN AuditMeasures On inserted.id = AuditMeasures.id
GO
问题:
- 我的解决方案有什么陷阱吗?例如,触发器内的代码将不会在事务内运行,从而给出错误的值。
- 我是否缺少更好的解决方案?
触发器内的代码肯定会在初始化基础表中的更改的事务上下文内运行。
—
Max Vernon
为什么需要将这些值存储在一起?这些值真的需要永久存在而不是在运行时确定吗?
—
亚伦·伯特兰
如果允许使用ID之间的空格,那么您可以创建一个简单的单曲
—
弗拉基米尔·巴拉诺夫
IDENTITY
,该单曲不会每天重置,并将其附加到当前日期。每个新的一天看起来好像都有越来越大的“差距”,但是差距是允许的,不是吗?当然,这是个玩笑,但它强调您必须省略一些要求。