gpt4 book ai didi

sql-server - 是否可以防止在没有 WHERE 子句的情况下执行 UPDATE 或 DELETE 语句?

转载 作者:行者123 更新时间:2023-12-04 04:29:07 25 4
gpt4 key购买 nike

正如标题所暗示的,如果没有 WHERE 子句,我们希望阻止 - 至少通过手动界面 - 在特定 SQL Server(2008 或更高版本)数据库或表上执行 UPDATE 和 DELETE 语句。

那可能吗?

最佳答案

你可以。这并不理想,但您可以创建表触发器来评估每个 UPDATEDELETE以确定它们将影响多少行。

Erik Darling 在 Brent Ozar's blog 上发布了有关它的博客。 .他和我都不一定会推荐它,但如果情况足够绝望,那么这会奏效。

这是链接中的相关代码,以防布伦特关闭商店。他很浮躁。

CREATE OR ALTER TRIGGER dbo.UseAWhereClauseNextTime
ON dbo.TriggerTest
FOR UPDATE, DELETE
AS
BEGIN

DECLARE @rc INT = @@ROWCOUNT;
DECLARE @table_rows INT = ( SELECT row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.TriggerTest')
AND index_id IN ( 0, 1 ));

IF EXISTS ( SELECT 1 FROM Inserted ) AND EXISTS ( SELECT 1 FROM Deleted )
BEGIN
IF (( @rc * 100 ) / ( @table_rows )) >= 98
BEGIN
RAISERROR('USE A WHERE CLAUSE DUMMY', 0, 1) WITH NOWAIT;
ROLLBACK;
END;
END;

IF NOT EXISTS ( SELECT 1 FROM Inserted ) AND EXISTS ( SELECT 1 FROM Deleted )
IF ( ( @table_rows = 0 )
OR ( @table_rows > 0
AND (( @rc * 100 ) / ( @table_rows + @rc )) >= 98 ))
BEGIN
RAISERROR('USE A WHERE CLAUSE DUMMY', 0, 1) WITH NOWAIT;
ROLLBACK;
END;

END;

GO
(( @rc * 100 ) / ( @table_rows )) >= 98 的两个子句将“坏”语句的阈值设置为受影响表的 98%,Erik 指出这是任意的,但也是可配置的。

关于sql-server - 是否可以防止在没有 WHERE 子句的情况下执行 UPDATE 或 DELETE 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com