是否可以验证 DML 语句?

kyo*_*ryu 1 dml

假设我想从数据库中删除一个名为“abc cba”的用户。所以我运行以下查询:

DELETE FROM table WHERE fname = 'abc' AND last name = 'cba'; commit;
Run Code Online (Sandbox Code Playgroud)

现在,可以有更多我不知道这个名字的用户。显而易见的选择是事先运行 select 语句并检查我是否删除了我真正想删除的内容,但我仍然是人类,我可以忘记这一点并最终搜索备份以检索丢失的数据。

我的问题是:有没有办法对语句强加某些规则,之后它们将不会执行 DML 语句(例如,如果删除的行数超过某个阈值,则不执行删除)?

Tho*_*ger 5

我只能代表 SQL Server,但唯一可以做到的方法是通过 DML 触发器(据我所知)。以下面为例:

use TestDB;
go

create table dbo.TestTriggerTable
(
    id int identity(1, 1) not null,
    some_int int not null
        default 1
);
go

insert into dbo.TestTriggerTable
default values;
go 1000

create trigger DeleteMaxRows
on dbo.TestTriggerTable
after delete
as

    if (select count(*) from deleted) > 10
    begin
        raiserror('Cannot delete more than 10 rows', 16, 1);
        rollback;
    end
go

select *
from dbo.TestTriggerTable;

-- this fails and rolls back
delete from dbo.TestTriggerTable
where id < 20;
go

-- this is successful
delete from dbo.TestTriggerTable
where id < 8;
go
Run Code Online (Sandbox Code Playgroud)

但是这种方法存在一些问题,我认为这不是一个好的设计。首先,您在触发器中有硬编码的要求(无论您是在执行设置的行数还是按行数的百分比……它仍然是硬编码的)。必须相应地设计应用程序以确保使用不同的逻辑重试。

这真正归结为拥有正确设计的数据库和正确构造的 DML 语句,以确保正在修改的数据是您想要的数据,而不必检查已删除行的行数。

在我看来,你应该花设计时间来弄清楚如何重新设计,这样你就不需要这个检查了。