Rozhodně bych nedoporučoval dělat z tohoto údaje klíč, pro klí použijte INT nebo UNIQUEIDENTIFIER. Pro vložení záznamu si udělejte proceduru v databázi a obalte to transakcí s isolation levelem SERIALIZABLE, aby vám tam nenastala kolize, kdyby se náhodou přidávaly dva záznamy najednou. Kolize při dvou současných přidáních by bez transakce nastala v případě, že si řekněme jedno vlákno zjistí, jaké pořadí má budoucí záznam mít, druhé si to ve stejnou chvíli zjistí také, dostanou tedy stejné hodnoty, a pak to obě dvě vlákna vloží. Dalo by se to vyřešit nějakým omezením na sloupec, ale transakce jsou lepší. Nejsem si jistý, jestli v následující ukázce kódu nemám nějakou chybu, píšu ji z hlavy. Pro transakci by možná stačil režim REPEATABLE READ, ale nejsem si 100% jistý, SERIALIZABLE by měl fungovat určitě, zajistí, že během jedné transakce nezmění jiná transakce tabulku, se kterou ta první pracuje. Nějak takto:
CREATE PROCEDURE [PridatZaznam] (
@Param1 INT,
...
) AS BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
-- vytáhnout počet záznamů v tomto roce
DECLARE @Poradi INT
SELECT @Poradi = COALESCE(COUNT(*) + 1, 1) FROM [Zaznamy] WHERE YEAR([Datum]) = YEAR(GETDATE())
-- vložit záznam
INSERT INTO [Zaznamy] ([Poradi], [Param1], ...) VALUES (@Poradi, @Param1, ...)
COMMIT
END
|