Devo aggiungere un trigger che dovrebbe aggiornare una colonna usando le seguenti stringhe di formato: <current_date>_<per_day_incremental_id>
ad es 2015-10-01_36
. Gli ID devono essere incrementali e gli spazi vuoti sono consentiti.
Il mio approccio è piuttosto ingenuo: creare una tabella con la data corrente e il valore della sequenza corrente e mantenere un singolo record al suo interno:
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
Domande:
- Ci sono delle insidie per la mia soluzione? ad es. il codice all'interno del trigger non verrà eseguito all'interno di una transazione, fornendo quindi valori errati.
- Mi sto perdendo una soluzione migliore?
IDENTITY
che non viene ripristinato ogni giorno e aggiungerlo alla data corrente. Ogni nuovo giorno sembrerà avere un "divario" sempre più grande, ma il divario è permesso, non è vero? È uno scherzo, ovviamente, ma sottolinea che è necessario aver omesso alcuni requisiti.