Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Можно запретить update без where ?  [new]
Dima T
Member

Откуда:
Сообщений: 15035
Бабахнул вчера случайно без where ID = ...
update MyTable set Field = 123

Сегодня полдня восстанавливал :)

Можно как-то запретить update/delete всей таблицы?
Есть какие-нибудь инструменты на стороне сервера для предотвращения подобных ошибок в запросах?

Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) Apr 29 2016 23:23:58
Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 14393: )

PS Пока дописал в триггеры критически важных таблиц откат транзакции при количестве записей в deleted больше разрешенного.
11 окт 16, 10:42    [19767616]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1741
Dima T
Бабахнул вчера случайно без where ID = ...
update MyTable set Field = 123

Сегодня полдня восстанавливал :)


Освойте такую вещь как ежедневный бэкап баз данных, контроль состояния бэкапов, и восстановление баз данных, а также восстановление базы данных в другую базу данных.
11 окт 16, 10:46    [19767640]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 888
Dima T,
можно права у себя отобрать.
11 окт 16, 10:50    [19767668]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Dima T
Member

Откуда:
Сообщений: 15035
DaniilSeryi
Освойте такую вещь как ежедневный бэкап баз данных, контроль состояния бэкапов, и восстановление баз данных, а также восстановление базы данных в другую базу данных.

Это освоено, оно и спасло. Иначе полдня не хватило бы.
11 окт 16, 10:52    [19767686]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Возьмите за правило, писать update, через cte, дольше но перед тем как запустить операцию, всегда можно увидеть, что будет изменено.

with cte as
(
select
field1 as tgt_field1
,123 as src_field2
)
update cte set
tgt_field1 = src_field2
11 окт 16, 11:04    [19767784]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Поспешил.

with cte as
(
select
field1 as tgt_field1
,123 as src_field2
from MyTable
)
update cte set
tgt_field1 = src_field2
11 окт 16, 11:06    [19767798]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Kapadastra
Member

Откуда:
Сообщений: 29
Dima T, насколько известно SSMS Boost такое умеет)
11 окт 16, 11:07    [19767809]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Dima T
Бабахнул вчера случайно без where ID = ...
Узнаю! Узнаю брата Колю! ©
Я в молодости тоже так сделал. Только у заказчика на рабочем сервере.
Заказчик был очень крутой - "АлмазЮвелирЭкспорт".
11 окт 16, 11:16    [19767884]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
В принципе, "без WHERE" означает "все записи таблицы".
(Хотя, легко написать условие в WHERE, чтобы оно было "липовым" и ничего на самом не ограничивало)

Стало быть, можно, например, проверить в триггере, что в таблице есть записи, которых нет в inserted.
Или проверить, что количество записей в таблице и в inserted разное.
Получится запрет на апдейт сразу всей таблицы.
11 окт 16, 12:36    [19768506]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3692
написать триггер на ddl на create и alter trigger.
и дальше анализировать, что там возвращает EVENTDATA
11 окт 16, 13:23    [19768773]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3692
Arm79
написать триггер на ddl на create и alter trigger.
и дальше анализировать, что там возвращает EVENTDATA

А для update, которые реально нужно применять ко всем записям, можно требовать наличия where 1=1
11 окт 16, 13:24    [19768783]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
it17
Member

Откуда:
Сообщений: 108
Kapadastra
Dima T, насколько известно SSMS Boost такое умеет)

+1, в качестве ограничения на стороне разработчика подходит
11 окт 16, 13:40    [19768867]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Addx
Member

Откуда:
Сообщений: 957
Делайте в транзакции)
Если что - rollback.
11 окт 16, 14:12    [19769062]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Dima T
Member

Откуда:
Сообщений: 15035
iap
В принципе, "без WHERE" означает "все записи таблицы".
(Хотя, легко написать условие в WHERE, чтобы оно было "липовым" и ничего на самом не ограничивало)

В идеале так и надо, захотел все - написал WHERE 1=1. Т.е. защита только от собственных ляпов в коде.

iap
Стало быть, можно, например, проверить в триггере, что в таблице есть записи, которых нет в inserted.
Или проверить, что количество записей в таблице и в inserted разное.
Получится запрет на апдейт сразу всей таблицы.

Так и сделал. Откат транзакции при количестве записей в deleted больше разрешенного.

Думал вдруг какая фича есть, поставил галку и сервер за тобой бдит. Есть же статические анализаторы кода в разных ЯП, ворнинги выдают, можно запретить компиляцию при наличии предупреждений, почему бы и в MSSQL такому не быть? Ну нет так нет, триггерами тоже решаемо.
11 окт 16, 14:23    [19769140]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
vanezy
Member

Откуда: Ekaterinburg->Moscow->Frankfurt
Сообщений: 122
Dima T
...
Думал вдруг какая фича есть, поставил галку и сервер за тобой бдит. Есть же статические анализаторы кода в разных ЯП, ворнинги выдают, можно запретить компиляцию при наличии предупреждений, почему бы и в MSSQL такому не быть? Ну нет так нет, триггерами тоже решаемо.


Вам же написали SSMS Boost!
11 окт 16, 17:23    [19770361]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
vanezy
Member

Откуда: Ekaterinburg->Moscow->Frankfurt
Сообщений: 122
с той лишь разницей что это надстройка над клиентом и сервер следить не будет
11 окт 16, 17:25    [19770376]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Dima T
Member

Откуда:
Сообщений: 15035
vanezy
Dima T
...
Думал вдруг какая фича есть, поставил галку и сервер за тобой бдит. Есть же статические анализаторы кода в разных ЯП, ворнинги выдают, можно запретить компиляцию при наличии предупреждений, почему бы и в MSSQL такому не быть? Ну нет так нет, триггерами тоже решаемо.


Вам же написали SSMS Boost!

У меня свой клиент, есть обертка над соединением с MSSQL, я могу туда прописать синтаксический анализ текста запроса перед отправкой на сервер, только нафиг это надо?
11 окт 16, 20:54    [19771085]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Dima T,

глупая какая-то тема, а всё тянется и тянется
не хватает квалификации - не лезь в релизную базу
на кошечках тренируйся
кроме апдейта есть и делиты и транкейты и дропы
можно релизную базу и блокировками какими-то положить

бэкапить надо нормально и всего делов
ну и не лезть если не уверен в себе
11 окт 16, 21:19    [19771166]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 782
Dima T,

Знавал я человека, которого за такую вот ошибку уволили.

Возьми себе за правило перед выполнением любой DML команды открывать транзакцию, а по завершении выполнения закрывать/откатывать транзакцию:

begin tran

update t1 set f1 = 'abcd'


Если ты понял что забыть написать условие, тогда:
rollback


Если же команда написана правильно
commit
11 окт 16, 21:53    [19771232]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Dima T,

у меня так вообще давно выработалась привычка всегда ставить begin tran ... rollback вокруг любых потенциально меняющих базу действий, да и вместо update-delete сначала всегда писать select. Проверил, посмотрел, если все ок - тогда уже можно писать update и commit.
11 окт 16, 22:13    [19771256]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7380
Давно завел себе правило: прежде чем запускать delete/update выполняю select с той же where кляузой. Смотрю сколько записей вернулось. В сложный операторах, да еще и сооединениями могут быть проблемы и с логикой, не только с where.
11 окт 16, 23:08    [19771347]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7380
А явными транзакциями на Проде лочить юзверов - не гуманно, я щетаю.
11 окт 16, 23:10    [19771351]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37010
нанять DBA уже предлагали?
12 окт 16, 00:12    [19771478]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
aleks2
Guest
Wizandr
нанять DBA уже предлагали?

Шоб отгонял программеров от сервера?
12 окт 16, 06:02    [19771624]     Ответить | Цитировать Сообщить модератору
 Re: Можно запретить update без where ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Делать сначала на тесте и только потом на проде не вариант?
12 окт 16, 08:20    [19771689]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить