Ограничьте вставку / удаление, используя пороговое значение - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу использовать триггер для таблицы, чтобы предотвратить вставку, обновление или удаление любых записей таблицы после счетчика> 2. По сути, я хочу предотвратить использование массовых операций. Пожалуйста, кто-нибудь может мне помочь? Можем ли мы использовать try catch для этого? Найдите приведенную ниже команду для создания триггера:

create  trigger [dbo].[DMLxTimes] on [dbo].[targetTable]
for insert, update, delete
as
begin

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
        THROW 50005, N'This statement cannot be executed', 1;
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

Эти запросы показывают ожидаемый результат для запроса вставки каждый раз, но для другого сценария. например, когда в это время изменяется счетчик для обновления и удаления, запрос иногда выдает выходные данные, а иногда для одного и того же запроса не работает одинаково. Например, при обновлении top (14), обновлении top (20) и т. д. c.

1 Ответ

1 голос
/ 25 февраля 2020

Мне очень жаль за путаницу ... вопрос в вопросе отлично работает для моего сценария.

create  trigger [dbo].[DMLxTimes] on [dbo].[targetTable]
for insert, update, delete
as
begin

declare @maxrows int = 2; --maximum number of rows allowed per dml action

if 
(select count(*) from inserted) > @maxrows
or
(select count(*) from deleted) > @maxrows

begin
        THROW 50005, N'This statement cannot be executed', 1;
end
end
GO

Это идеально подходит для моего сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...