Який ваш спосіб No1 бути обережним із активною базою даних? [зачинено]


80

Для моїх клієнтів я час від часу працюю в їхній базі даних, щоб виправити проблему, яку вони створили для себе, або щоб виправити помилкові дані, які створили помилки мого продукту. Подібно до кореневого доступу Unix, це просто небезпечно. Які уроки я повинен навчитися заздалегідь?

Яку річ No1 ви робите, щоб бути обережними при роботі з реальними даними?

Відповіді:


101

Три речі, яких я навчився важким шляхом за ці роки ...

По-перше, якщо ви робите оновлення або видаляєте дані в реальному часі, спочатку напишіть запит SELECT із пропозицією WHERE, яку ви будете використовувати. Переконайтесь, що це працює. Переконайтеся, що це правильно. Потім додайте оператор UPDATE / DELETE до відомого робочого речення WHERE.

Ви ніколи не хочете мати

DELETE FROM Customers

сидячи у своєму аналізаторі запитів, чекаючи на те, що ти напишеш речення WHERE ... випадково натиснув "Виконати", і ти щойно вбив таблицю своїх клієнтів. На жаль

Крім того, залежно від вашої платформи, з’ясуйте, як швидко зробити “резервну копію таблиці”. У SQL Server 2005,

SELECT *
INTO CustomerBackup200810032034
FROM Customer

скопіює кожен рядок з усієї таблиці Клієнта в нову таблицю під назвою CustomerBackup200810032034, яку ви зможете видалити після того, як оновите оновлення та переконаєтесь, що все в порядку. Якщо трапиться найгірше, набагато легше відновити відсутні дані з цієї таблиці, ніж спробувати відновити вчорашню резервну копію з диска або стрічки.

Нарешті, будьте обережні, коли каскадні видалення позбавляються від речей, які ви не збиралися видаляти - перед тим, як щось змінювати, перевірте взаємозв'язок таблиць та ключові обмеження.


1
ви не маєте на увазі ВИДАЛЕННЯ З Клієнтів, які просто технічні :-)
craigmoliver

5
Або ще краще не використовувати каскадні речі.
dkretz

108
BEGIN TRANSACTION;

Таким чином ви можете відмовитись після помилки.


Так, майже єдиний спосіб запобігти божевіллю на обличчі.
willasay, що

11
@Graeme, ти не повинен робити DDL у виробничих базах даних. Вам слід написати сценарій, запустити його у своїй тестовій базі даних, і після того, як ваша тестова база даних пройде QA, ви запустите його на робочому сервері.
Пол Томблін,

1
@ Пол: абсолютно. Але можна стверджувати, що ви повинні робити те саме з будь-якими модифікаціями вашої виробничої бази даних, будь то DDL чи DML, і в цьому випадку все це питання безглуздо.
Graeme Perrow

3
Едуардо, на сьогоднішній день він набрав 45 голосів, оскільки - здебільшого - ваше холодне потовиділення починається ще до того, як палець закінчує рух по клавіатурі - але занадто пізно, щоб зупинити палець.
Euro Micelli,

1
Це також корисно тим, що ви можете запустити купу селектів в рамках однієї транзакції, щоб перевірити результати перед фіксацією - якщо вони несподівані, шкоди не завдано - просто відкатіть назад.
Дейв Клудерей,

50

Спочатку зробіть резервну копію: це все одно має бути законом номер 1 системного адміністрування

EDIT : враховуючи сказане іншими, переконайтесь, що ваші ОНОВЛЕННЯ мають відповідні пункти WHERE.

В ідеалі, зміна оперативної бази даних ніколи не повинна відбуватися (крім ВСТАВКИ та базового обслуговування). Зміна структури реального БД особливо чревата потенційно поганою кармою.


25

Внесіть зміни в копію, і коли вас це влаштує, застосуйте виправлення до live.


Здебільшого копія db відрізняється від реальної, і не всі зміни поводяться так само, як копіювати та жити.
bugBurger

Якщо база даних копій відрізняється від бази даних у реальному часі, чи не означає це, що насправді це не база даних копій? Повна мета бази даних test / qa / copy - перевірити зміни перед тим, як їх застосувати до реальної / виробничої бази даних.
Wilco

22

Часто перед тим, як зробити ОНОВЛЕННЯ або ВИДАЛИТИ, я пишу еквівалентний SELECT.


Як швидку та просту перевірку мені подобається і цей метод. Залежно від кількості результатів це може не спрацювати, але принаймні це початок для ОНОВЛЕННЯ І ВИДАЛЕННЯ.
osp70

18

НІКОЛИ не робіть оновлення, якщо ви не перебуваєте у ПОЧАТКУ TRAN t1 - ні в базі даних розробників, ні у виробництві, ні де-небудь. НІКОЛИ не запускайте COMMIT TRAN t1 поза коментарем - завжди введіть

--COMMIT TRAN t1

а потім виберіть оператор, щоб його запустити. (Очевидно, це стосується лише клієнтів із графічним інтерфейсом.) Якщо ви зробите ці дії, це стане другою природою робити їх, і ви навряд чи втратите час.

Я насправді макрос "оновлення", який вводить це. Я завжди вставляю це, щоб налаштувати оновлення. Ви можете зробити подібний для видалення та вставки.

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1

Так, я саме цим займаюся. Занадто багато людей говорять "не забувайте речення where", але що, якщо це неправильно? Ніколи, ніколи не оновлюйте базу даних без цього шаблону початок / відкат / - коміт.
Eric Z Beard

Додатковим вдосконаленням є спочатку зробити "select * from" із реченням where, щоб переконатися, що він правильний, а потім запустити оновлення з тим самим реченням where.
Eric Z Beard

Ерік має рацію, хоча я залишаю це поза своїм макросом, щоб уникнути повзучості. У мене є інший макрос, який видає "select * from" для загального користування.
Патрік Салапський,

Немає вагомих причин не робити цього таким чином. Коли мені доводилося писати сценарії оновлення на попередній роботі, я робив це таким чином, разом із SELECT перед оновленням та SELECT після , щоб я міг бачити результати. Запустивши його кілька разів і переконавшись, що результати були правильними, я змінив ROLLBACK на COMMIT.
Ryan Lundy

13

Завжди переконайтесь, що ваші UPDATE та DELETE мають відповідний пункт WHERE.


Так, я вже згорів на цьому раніше.
Ian Jacobs

Я також. З тих пір я хотів, щоб SQL був розроблений таким чином, щоб речення where було першим.
Грег Хьюгілл

Потрібно любити це відчуття западання при швидкому ОНОВЛЕННІ, і в ньому написано: "1279209394 Запис (и) зазнали впливу". Ой-ой. ;)
Кевін Фейрчайлд

13

Щоб відповісти на власне запитання:

Під час написання заяви про оновлення напишіть її не по порядку.

  1. Пишіть UPDATE [table-name]
  2. Пишіть WHERE [conditions]
  3. Поверніться і напиши SET [columns-and-values]

Вибір рядків, які потрібно оновити, перш ніж сказати, які значення потрібно змінити, є набагато безпечнішим, ніж робити це в іншому порядку. Це робить неможливим update person set email = 'bob@bob.com'сидіння у вікні запиту, готове до запуску неправильним натисканням клавіші, готове зіпсувати кожен рядок таблиці.

Редагувати: Як казали інші, перед написанням напишіть WHEREпункт про видалення DELETE.


11

Як приклад, я створюю такий SQL

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

Я виділяю текст від кінця до Виділення та запускаю цей SQL. Після того, як я переконаюсь, що він тягне запис, який я хочу оновити, я натискаю shift-up, щоб виділити оператор оновлення та запустити його.

Зауважте, що я використовував псевдонім. Я ніколи не оновлюю чіткість імені таблиці. Я завжди використовую псевдонім.

Якщо я роблю це спільно з транзакціями та відкатом / комітами, я справді дуже справді в безпеці.


Я також використовую перевірку select - таким чином я виявив кілька помилок клаузули. Це хороша перевірка осудності, особливо коли твердження складні.
Боб Пробст

Цей метод відточували протягом короткого періоду після того, як посеред дня спостерігав, як мій керівник видаляв важливу виробничу таблицю.
wcm

Я перемикаю вибір та оновлюю та видаляю коментарі до вибраного. Потім, коли я буду готовий, я виділяю область і біжу. Працює і на видалення.
rball

11

Мій спосіб No1 бути обережним із активною базою даних? Не чіпайте його. :)

Резервні копії можуть скасувати шкоду, яку ви завдаєте базі даних, але ви все одно ймовірно матимете негативні побічні ефекти протягом цього періоду часу.

Незалежно від того, наскільки надійним ви вважаєте сценарій, з яким працюєте, запустіть його протягом тестового циклу. Навіть якщо "тестовий цикл" означає запуск сценарію проти власного екземпляра бази даних, переконайтеся, що ви це робите. Набагато краще вносити дефекти на місцевій коробці, ніж виробниче середовище.


6
  1. Перевірте, перевірте та перевірте будь-який документ, який робить оновлення. Навіть якщо ви думаєте, що просто виконуєте просте оновлення в одній колонці, рано чи пізно вам не вистачить кави і ви забудете речення "де", обнуляючи цілу таблицю.

Ще кілька речей, які я знайшов корисними:

  • якщо ви використовуєте MySQL, увімкніть безпечні оновлення

  • Якщо у вас є DBA, попросіть їх це зробити.

Я виявив, що ці три речі утримали мене від серйозної шкоди.


Так, класичний: UPDATE TABLE_NAME SET FIELD_X = 'what' [WHERE = отсутствует]
Stefan Steiger

6
  • Ніхто не хоче резервного копіювання, але всі плачуть про відновлення
  • Створіть свою БД із посиланнями на зовнішні ключі, оскільки ви повинні:
  • максимально ускладніть собі оновлення / видалення даних та руйнування структурної цілісності / щось інше
  • Якщо це можливо, запустіть систему, де вам доведеться внести зміни, перш ніж постійно зберігати їх (тобто деактивувати автокомітування під час відновлення db)
  • Спробуйте визначити класи вашої проблеми, щоб ви зрозуміли, як це виправити без проблем
  • Отримайте рутину відтворення резервних копій у базі даних, завжди майте під рукою другу базу даних на тестовому сервері, щоб ви могли просто працювати над цим
  • Тому що пам’ятайте: якщо щось не вдається повністю, вам потрібно якнайшвидше почати працювати

Ну, це приблизно все, що я зараз можу придумати. Візьміть сміливі уривки, і ви побачите, що для мене No1. ;-)


Я хотів би лише додати до згадки про autocommit, оскільки це важливий механізм безпеки. Якщо ви підключаєтеся безпосередньо до бази даних, ви зазвичай можете вимкнути автокомітування в параметрах з'єднання db. В іншому випадку (db інтерфейсний продукт), можливо, вам доведеться шукати налаштування програми.
Майк Монетт,

3

Можливо, подумайте про те, щоб взагалі не використовувати видалення чи видалення. Або, можливо, зменшити дозволи користувача, щоб лише спеціальний користувач БД міг видаляти / скидати речі.


3

Якщо ви використовуєте Oracle або іншу базу даних, яка її підтримує, перевірте свої зміни перед тим, як робити COMMIT.


Ви повинні бути обережними, оскільки записи можуть бути заблоковані, поки ваша транзакція очікує на розгляд.
Грег Огле

Зазвичай я використовую розробник SQL для Oracle, і він ніколи не виконується автоматично навіть після запуску. Отже, у нас є попередній перегляд, а потім коміт. Класна функція !!
lakshminb7

3

Дані завжди слід розгортати для роботи за допомогою скриптів, які можна репетирувати стільки разів, скільки потрібно, щоб отримати їх прямо на dev. Коли є залежні дані, щоб сценарій працював правильно на dev, сформулюйте його належним чином - ви не зможете уникнути цього кроку, якщо справді хочете бути обережними.




2

Щоб додати те, що сказав @ Wayne , напишіть свою WHEREназву перед таблицею в DELETEабо UPDATEзаяві.


2

РЕЗЕРВУЙТЕ ВАШІ ДАНІ. Дізнався, що важко працювати на регулярній основі з базами даних клієнтів.



2

Моє правило (як розробника програми): Не чіпайте його! Для цього призначені навчені DBA. Чорт візьми, я навіть не хочу дозволу торкатися його. :)


2

Різні кольори для кожного середовища: ми налаштували наш розробник PL \ SQL (IDE для Oracle) так, щоб при вході в робочу БД усі вікна були яскраво-червоними. Деякі дійшли до того, що призначили інший колір для розробників та тестів.



1

завжди спочатку перевіряйте будь-які запити, крім відбору, щодо даних розробки, щоб переконатися, що вони мають правильний вплив.


1
  1. якщо це можливо, попросіть з ким-небудь пару
  2. завжди рахуйте до 3 перед натисканням клавіші Enter (якщо поодинці, оскільки це розлютить вашого партнера по парі!)

1

Якщо я оновлюю базу даних за допомогою сценарію, я завжди переконуюсь, що ставлю точку зупинки або дві на початку мого сценарію, про всяк випадок, якщо випадково запущу / виконаю.


1

Я додаю до рекомендацій щодо BEGIN TRAN перед ОНОВЛЕННЯМ, просто не забудьте насправді зробити COMMIT; Ви можете нанести стільки ж збитків, якщо залишити незароблену транзакцію відкритою. Не відволікайтеся на телефони, колеги, обід тощо, коли ви перебуваєте в середині оновлень, інакше ви знайдете, що всі інші заблоковані, доки ви НЕ ВЖИВАТИСЯ або ВІДМОВИТИСЯ.


1

Я завжди коментую будь-які руйнівні запити (вставляти, оновлювати, видаляти, скидати, змінювати), виписуючи спеціальні запити в Query Analyzer. Таким чином, єдиний спосіб їх запустити - це виділити їх, не виділяючи коментовану частину, та натиснути F5.

Я також вважаю, що це гарна ідея, як уже зазначалося, написати своє твердження where десь із виділенням і переконатись, що ви змінюєте правильні дані.


1
  1. Завжди створюйте резервні копії, перш ніж переодягатися.
  2. Завжди створюйте моди (наприклад, ALTER TABLE) за допомогою сценарію.
  3. Завжди змінюйте дані (наприклад, ВИДАЛИТИ) за допомогою збереженої процедури.

1

Створіть користувача лише для читання (або змусіть DBA це зробити) і використовуйте цього користувача лише для перегляду БД. Додайте відповідні дозволи до схеми, щоб ви могли переглядати вміст збережених процедур / переглядів / тригерів / тощо. але не мають можливості їх змінювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.