Я должен добавить триггер, который должен обновить столбец, используя следующие строки формата:, <current_date>_<per_day_incremental_id>
например 2015-10-01_36
. Идентификаторы должны быть инкрементными, и пробелы допускаются.
Мой подход довольно наивен: создайте таблицу с текущей датой и текущим значением последовательности и сохраните в ней одну запись:
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
Вопросов:
- Есть ли подводные камни для моего решения? например, код внутри триггера не будет выполняться внутри транзакции, что дает неправильные значения.
- Я пропускаю лучшее решение?
IDENTITY
который не сбрасывается каждый день, и добавлять его к текущей дате. Каждый новый день будет выглядеть так, как будто он имеет все больший и больший «разрыв», но разрыв допускается, не так ли? Конечно, это шутка, но она подчеркивает, что вы должны были опустить некоторые требования.