Saya memiliki tabel konfigurasi di database SQL Server saya dan tabel ini seharusnya hanya memiliki satu baris. Untuk membantu pengembang di masa depan memahami hal ini, saya ingin mencegah lebih dari satu baris data ditambahkan. Saya telah memilih untuk menggunakan pemicu untuk ini, seperti di bawah ini ...
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
Ini tidak menimbulkan kesalahan tetapi tidak mengizinkan baris pertama masuk.
Juga adakah cara yang lebih efektif / lebih menjelaskan diri sendiri untuk membatasi jumlah baris yang dapat dimasukkan ke dalam tabel menjadi hanya 1, daripada ini? Apakah saya kehilangan fitur SQL Server bawaan?
Jawaban:
Dua kendala ini akan membuat:
Anda memerlukan keduanya
PRIMARY KEY
(atauUNIQUE
batasan) sehingga tidak ada dua baris yang memiliki nilai yang samaID
, danCHECK
kendala sehingga semua baris memiliki nilai yang samaID
(dipilih secara sewenang-wenang1
).Secara kombinasi, dua kendala yang hampir berseberangan membatasi jumlah baris menjadi nol atau satu.
Pada DBMS fiksi (tidak ada implementasi SQL saat ini memungkinkan konstruksi ini) yang memungkinkan kunci primer yang terdiri dari 0 kolom, ini juga akan menjadi solusi:
sumber
Anda bisa mendefinisikan ID sebagai kolom yang dihitung yang mengevaluasi nilai konstan, dan menyatakan kolom itu unik:
sumber
Anda juga dapat menggunakan pemicu ..
sumber
Tampaknya sedikit persyaratan aneh tapi ho-hum :) Anda bisa saja memiliki kendala di atas meja dan kemudian hanya memperbolehkan pembaruan (tanpa memasukkan atau menghapus) ke tabel?
Ini sedikit cara hackey untuk melakukannya, bukankah lebih baik hanya memaksakan perubahan pada konfigurasi melalui prosedur tersimpan yang kemudian dapat menangani semua logika ini untuk Anda?
sumber
ID
untuk memiliki nilai0
atau nilai negatif. Dan sebagai @Mat poin, itu akan gagal jika Anda mencoba memasukkan baris lain jika yang pertama dihapus.INSERT INTO dbo.Config DEFAULT VALUES;
hanya sekali, tetapi Anda dapat mengikutinyaSET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF;
berkali-kali, dan Anda akan berakhir dengan beberapa tabel baris.