Eu tenho uma tabela de configuração no meu banco de dados SQL Server e essa tabela deve ter apenas uma linha. Para ajudar futuros desenvolvedores a entender isso, gostaria de evitar que mais de uma linha de dados fosse adicionada. Eu optei por usar um gatilho para isso, como abaixo ...
ALTER TRIGGER OnlyOneConfigRow
ON [dbo].[Configuration]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @HasZeroRows BIT;
SELECT @HasZeroRows = CASE
WHEN COUNT (Id) = 0 THEN 1
ELSE 0
END
FROM
[dbo].[Configuration];
IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
BEGIN
RAISERROR ('You should not add more than one row into the config table. ', 16, 1)
END
END
Isso não gera um erro, mas não permite que a primeira linha entre.
Também existe uma maneira mais eficaz / mais autoexplicativa de limitar o número de linhas que podem ser inseridas em uma tabela para apenas 1, do que isso? Estou faltando algum recurso interno do SQL Server?
Essas duas restrições fariam:
Você precisa de
PRIMARY KEY
(ou de umaUNIQUE
restrição) para que não haja duas linhas com o mesmoID
valor e daCHECK
restrição para que todas as linhas tenham o mesmoID
valor (escolhido arbitrariamente como1
).Em combinação, as duas restrições quase opostas restringem o número de linhas a zero ou um.
Em um DBMS fictício (nenhuma implementação SQL atual permite essa construção) que permite uma chave primária composta por 0 colunas, isso também seria uma solução:
Você pode definir o ID como uma coluna computada avaliada para um valor constante e declarar essa coluna como exclusiva:
Você também pode usar o gatilho..
Parece um requisito um pouco estranho, mas ho-hum :) Você poderia apenas ter uma restrição na tabela e permitir apenas atualizações (sem inserção ou exclusões) na tabela?
No entanto, é uma maneira um pouco complicada de fazer isso, não seria melhor apenas impor alterações na configuração por meio de um procedimento armazenado que pode lidar com toda essa lógica para você?