Tengo una tabla de configuración en mi base de datos de SQL Server y esta tabla solo debería tener una fila. Para ayudar a los futuros desarrolladores a comprender esto, me gustaría evitar que se agregue más de una fila de datos. He optado por usar un disparador para esto, como se muestra a continuación ...
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
Esto no arroja un error pero no permite que entre la primera fila.
Además, ¿hay una forma más efectiva / más autoexplicativa de limitar el número de filas que se pueden insertar en una tabla a solo 1, que esto? ¿Me falta alguna función incorporada de SQL Server?
Respuestas:
Estas dos restricciones harían:
Necesita tanto la
PRIMARY KEY
(o unaUNIQUE
restricción) para que no haya dos filas con el mismoID
valor, como laCHECK
restricción para que todas las filas tengan el mismoID
valor (elegido arbitrariamente para1
).En combinación, las dos restricciones casi opuestas restringen el número de filas a cero o uno.
En un DBMS ficticio (ninguna implementación SQL actual permite esta construcción) que permita una clave primaria que consta de 0 columnas, esta sería una solución también:
fuente
Puede definir la ID como una columna calculada que evalúa un valor constante y declarar que esa columna es única:
fuente
También puedes usar el gatillo.
fuente
Parece un requisito un poco extraño, pero aburrido :) ¿Podría tener una restricción en la tabla y luego solo permitir actualizaciones (sin insertar o eliminar) en la tabla?
Sin embargo, es una forma un poco hackeadora de hacerlo, ¿no sería mejor simplemente imponer cambios en la configuración a través de un procedimiento almacenado que luego puede manejar toda esta lógica por usted?
fuente
ID
que tenga un valor0
negativo o negativo. Y como apunta @Mat, fallará si intenta insertar otra fila si se elimina la primera.INSERT INTO dbo.Config DEFAULT VALUES;
solo una vez, pero puede seguirlaSET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF;
muchas veces y terminará con una tabla de varias filas.