Я думаю, вы задаете не тот вопрос.Вы хотите предотвратить удаление, которое удаляет все строки (или некоторые высокие% строк), а не удаление, которое не имеет предложения WHERE
.
Нечестивый или неряшливый, преднамеренный или нет, я могу легко победить любой разбор для явного предложения WHERE
и все равно удалить все строки.
DELETE dbo.table WHERE 1 = 1;
DELETE dbo.table WHERE key_column > 0;
И намеренно или нет,Я могу отклонить, не прочитать или случайно нажать клавишу Enter или выполнить ошибочный щелчок мышью для любого всплывающего окна, предлагаемого подключаемым модулем, так что только то, что подключаемый модуль дает мне предупреждение, не означает, что он сможет предотвратитьв любом случае, я не смог сделать то, что пытался сделать.
И, конечно, вы можете неправильно заблокировать запрос, который затрагивает всего одну строку, если вы считаете, что отсутствие условия WHERE
означает, что оно удалит всестрок.Все следующие операторы должны ограничиваться одной затронутой строкой (или более со связями), даже если не найдено ни одного предложения WHERE
:
DELETE TOP (1) dbo.table;
;WITH RowToDelete AS
(
SELECT key_column FROM dbo.table
GROUP BY key_column
HAVING (key_column = 1)
)
DELETE RowToDelete;
;WITH RowToDelete AS
(
SELECT key_column, rn = ROW_NUMBER() OVER (ORDER BY key_column)
FROM dbo.table
)
DELETE TOP (1) RowToDelete;
Если вы хотите, чтобы фактически запретил случайное удаление всех строк, вы можете сделать это в триггере, как предложено в другом ответе, просто помните, что триггер есть, когда вы когда-нибудь захотите его обойти, и обратите внимание, что он не помогает truncate
или drop
илиtransfer
.