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, eu gostaria de impedir que mais de uma linha de dados seja adicionada. 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 a entrada da primeira linha.
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, além disso? Estou faltando algum recurso interno do SQL Server?
Respostas:
Essas duas restrições serviriam:
Você precisa da
PRIMARY KEY
(ou umaUNIQUE
restrição) para que não haja duas linhas com o mesmoID
valor e aCHECK
restrição para que todas as linhas tenham o mesmoID
valor (escolhido arbitrariamente1
).Em conjunto, as duas restrições quase opostas restringem o número de linhas a zero ou uma.
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:
fonte
Você pode definir o ID como uma coluna calculada avaliando um valor constante e declarar essa coluna como única:
fonte
Você também pode usar o gatilho ..
fonte
Parece um requisito estranho, mas ho-hum :) Você só pode ter uma restrição na tabela e permitir apenas atualizações (sem inserção ou exclusão) na tabela?
No entanto, é uma maneira um tanto hackey de fazer isso, não seria melhor apenas impor alterações na configuração por meio de um procedimento armazenado que pode então lidar com toda essa lógica para você?
fonte
ID
valor0
seja negativo ou negativo. E como o @Mat aponta, ele falhará se você tentar inserir outra linha se a primeira for excluída.INSERT INTO dbo.Config DEFAULT VALUES;
apenas uma vez, mas pode segui-laSET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF;
várias vezes, e você terminará com uma tabela de várias linhas.