Concordo com Sean - adicione uma coluna de identidade e, em seguida, use uma coluna computada para o ID da tarefa. Mesmo que eu tenha respondido a uma pergunta muito parecida com esta aqui, não tenho certeza de marcar esta como duplicada. A razão para isso é que você deseja usar o
task_id
como parte da chave primária.No entanto, não tenho certeza de que isso seja possível, pois para incluir uma coluna computada na chave primária ela deve ser
persisted
, e por algum motivo (acho que é por causa do uso de uma UDF) o SQL Server não me permite marcá-lo como persistente.De qualquer forma, aqui está minha solução proposta para isso:
Primeiro, crie uma função que calculará o ID da tarefa:
CREATE FUNCTION dbo.GenerateTaskId
(
@Row_Id int,
@Issue_Id int,
@Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN
RETURN
(
SELECT COUNT(*)
FROM dbo.Tasks
WHERE Issue_Id = @Issue_Id
AND Issue_Sub_ID = @Issue_Sub_ID
AND Row_Id <= @Row_Id
)
END
GO
Em seguida, crie a tabela com o ID da tarefa como uma coluna computada:
CREATE TABLE dbo.Tasks
(
Row_Id [int] IDENTITY(1,1),
Issue_ID [int] NOT NULL,
Issue_Sub_ID [int] NOT NULL,
Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id),
CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO
Agora, teste:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Resultados:
Row_Id Issue_ID Issue_Sub_ID Task_Id
1 12345 1 1
2 12345 1 2
3 12345 1 3
4 12345 2 1
5 12345 2 2
6 67890 2 1
7 67890 2 2
8 67890 2 3
Você pode ver uma demonstração ao vivo no rextester.