Dib*_*Dib 24 trigger sql-server insert limits row
我的 SQL Server 数据库中有一个配置表,该表应该只有一行。为了帮助未来的开发人员理解这一点,我想防止添加多于一行的数据。我选择为此使用触发器,如下所示......
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
Run Code Online (Sandbox Code Playgroud)
这不会引发错误,但不允许第一行进入。
还有比这更有效/更自我解释的方法可以将可以插入表中的行数限制为 1 吗?我是否缺少任何内置的 SQL Server 功能?
ype*_*eᵀᴹ 54
这两个约束会做:
CREATE TABLE dbo.Configuration
( ConfigurationID TINYINT NOT NULL DEFAULT 1,
-- the rest of the columns
CONSTRAINT Configuration_PK
PRIMARY KEY (ConfigurationID),
CONSTRAINT Configuration_OnlyOneRow
CHECK (ConfigurationID = 1)
) ;
Run Code Online (Sandbox Code Playgroud)
您需要PRIMARY KEY(或UNIQUE约束),因此没有两行具有相同的ID值,以及CHECK约束,因此所有行都具有相同的ID值(任意选择为1)。
结合起来,这两个几乎相反的约束将行数限制为 0 或 1。
在允许由 0 列组成的主键的虚构 DBMS(当前没有 SQL 实现允许这种构造)上,这也将是一个解决方案:
CREATE TABLE dbo.Configuration
( -- no ConfigurationID needed at all
-- the rest of the columns
CONSTRAINT Configuration_PK
PRIMARY KEY () -- 0 columns!
) ;
Run Code Online (Sandbox Code Playgroud)
And*_*y M 24
您可以将 ID 定义为计算结果为常量值的列,并声明该列是唯一的:
CREATE TABLE dbo.Configuration
(
ID AS CAST(1 AS tinyint), -- or: AS bit
... -- other columns
CONSTRAINT UQ_Configuration_ID UNIQUE (ID)
);
Run Code Online (Sandbox Code Playgroud)
小智 9
您也可以使用触发器..
create trigger LimitTable
on YourTableToLimit
after insert
as
declare @tableCount int
select @tableCount = Count(*)
from YourTableToLimit
if @tableCount > 50
begin
rollback
end
go
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30496 次 |
| 最近记录: |