Мне часто приходится вставлять, обновлять или удалять данные на производственном сайте (как аналитик данных, это, вероятно, 40% моей работы). В большинстве случаев это происходит через автоматизированные пакеты DTS или SSIS. Тем не менее, мы также люди, которые должны исправлять записи о проблемах или обновлять производство, когда происходит серьезное изменение на основе клиента (например, реорганизация отдела продаж). Иногда проблемы возникают из-за ошибок в коде, но, как правило, они являются результатом странных вещей, которые клиент сделал со своим файлом, или того, что пользователям удалось испортить, чтобы сэкономить время на устранение проблемы, или потому, что они хотели обойти только для этого быстрого и простого изменения! (Примечание для пользователей - Пожалуйста, не пытайтесь исправить вещи вручную, что обычно делается с помощью автоматизированного процесса, вы не знаете, что еще может делать этот процесс !!!!!) иногда мы не можем позволить себе роскошь сначала протестировать скрипт на dev, так как то, что нужно исправить, не на dev.
Мои правила: никогда не вставляйте данные непосредственно из файла в рабочую таблицу. Всегда приносите его на рабочий стол, чтобы вы могли просмотреть его первым. Проведите проверки, чтобы в случае наличия в файле неверных данных процесс завершился неудачей, прежде чем вы перейдете к последнему этапу вставки в производственные данные. Сначала очистите данные.
Если вам необходимо удалить большое количество записей, это может спасти вас, если вы сначала выберете эти записи в рабочей таблице. Затем сделайте удаление. Таким образом, если что-то пойдет не так, гораздо легче прийти в себя. Если у вас есть таблицы аудита, знайте, как быстро восстановить данные из них. Опять же, если что-то пойдет не так, восстановиться из таблиц аудита будет намного быстрее, чем из резервной копии на ленте.
Я пишу оператор удаления следующим образом:
начать транс
удалить
- выберите (перечислите важные поля для просмотра здесь)
из таблицы1 a, где field1 = 'x'
- откат тран
- совершить транс
Обратите внимание на несколько вещей об этом. Во-первых, используя псевдоним, я не могу случайно удалить всю таблицу, выделив только одну строку и выполнив код. Запуская предложение where в той же строке, что и таблица, я гораздо реже пропускаю его выделение. Если бы у меня были объединения, я бы удостоверился, что каждая строка заканчивается в месте, где код не будет работать, если он не перейдет к следующей строке. Опять же, это гарантирует, что вы получите ошибку вместо oopsie. Всегда сначала выполняйте команду select и запишите количество затронутых записей (и посмотрите на данные, чтобы убедиться, что они выглядят как правильные записи!). Затем не выполняйте фиксацию, если количество записей не является правильным при запуске фактического удаления. Да, лучше начинать where на отдельной строке, безопаснее заканчивать каждую строку удаления, чтобы она не выполнялась, если не выделен весь запрос.
Обновления следуют симлиарным правилам.