sql-server - 在 Table 上设置触发器以限制 INSERT、DELETE、UPDATE 操作的数量
问题描述
例如:用户在给定时间点对特定表的操作不应该超过X次,如果用户执行操作INSERT
X +1次,则会启动触发器。DELETE
UPDATE
解决方案
create table dbo.targetTable
(
id int,
colA varchar(10)
);
go
create or alter trigger dbo.DMLxTimes on dbo.targetTable
for insert, update, delete
as
begin
/*
--old days..
IF @@ROWCOUNT > 5
begin
rollback;
end
--*/
declare @maxrows int = 5; --maximum number of rows allowed per dml action
if
(select count(*) from inserted) > @maxrows
or
(select count(*) from deleted) > @maxrows
begin
rollback;
end
end
go
insert into dbo.targetTable(id, colA)
values (0, 'a'),(0, 'a'),(0, 'a'),(0, 'a'),(0, 'a'); --5 rows inserted
go
insert into dbo.targetTable(id, colA)
values (0, 'a'),(0, 'a'),(0, 'a'),(0, 'a'),(0, 'a'),(0, 'a'); --6 rows inserted ... error
go
insert into dbo.targetTable(id, colA)
values (0, 'a'),(0, 'a'); --2 rows inserted
go
--all updated, error
update dbo.targetTable
set colA = colA;
go
--ok
update top(5) dbo.targetTable
set colA = colA;
go
delete top (4) from dbo.targetTable;
go
--ok
update top(15) dbo.targetTable
set colA = colA;
go
推荐阅读
- laravel - laravel - 我尝试使用 href 图标从数据库中删除表中的行
- python - 如何修补 matplotlib 绘图函数
- android - 如何使用广播接收器仅显示一次吐司(以非重复方式)?
- jquery - 基于文本输入的过滤器
- java - 绘制/显示电视噪音 - 黑白像素在全屏上随机闪烁
- java - 每5分钟重启一次android后如何检查互联网连接?
- java - 如何设置索引值以更改每个列标题的颜色以及如何从 API 请求中设置颜色?
- swift - NavigationView 上的编程导航比两个视图更深
- r - R 中的 %in% 问题
- nginx - 秘密 argocd/argo-cert-prod 已更新并用于入口注释