2015-03-30 2 views
-2

Теперь я обновляю несколько таблиц с столбцами, в которых хранятся номера социального страхования как одна транзакция? У меня более 70 таблиц, чтобы обновить ssn с помощью правильного ssn.Мне нужна помощь при написании хранимой процедуры

Обновление строго по запросу. Иногда я получаю призывы к клиенту, который ошибочно ввел свои ssn в первый раз, когда они зарегистрировались на нашем веб-сайте. когда я получаю такой запрос, я вручную обновляю все ssn в каждой таблице базы данных, в которой хранится информация о клиенте. Очень утомительная задача обновить более 70 таблиц с помощью столбцов ssn один за другим. Кто-нибудь может подумать, как это сделать эффективно? Может ли кто-нибудь показать мне, как писать хранимую процедуру, которую я могу передать в старом SSN и новом SSN, а затем обновляет 70 таблиц?

У кого-нибудь есть синяя печать, которая демонстрирует, как писать хранимую процедуру?

TableName ColumnName 
table1  colA 
table2  colB 
table3  colC 
table4  cold 

я запроса INFORMATION_SCHEMA.COLUMNS вид, чтобы восстановить все таблицы, которые Ssn столбцы, как показано выше.

+2

Если вы Ssn в 70 таблицах, то вы не нормированный базы данных. SSN должен находиться только в одном месте. – Paparazzi

+0

В дополнение к тому, что сказал Блэм, не видя ваших структур данных, довольно сложно написать конкретный запрос; просто «таблица обновления хранимой процедуры tsql» для синтаксиса. – LittleBobbyTables

+0

SSN - это личная информация. Это действительно должно быть отделено от других данных, зашифрованных и, как говорит Блэм, хранится в одном месте. И люди задаются вопросом, почему кража данных в Target, sony, Home Depot и других предприятиях - большие новости ... 70 таблиц 70 изменений, чтобы украсть личность ... – xQbert

ответ

0

Вы можете выполнить несколько хранимых процедур, если они уже существуют, или вы можете написать сценарий обновления для каждой таблицы в новой хранимой процедуре, аналогичной этой структуре.

DECLARE @OldSSN VARCHAR(9) = "00000000", 
     @NewSSN VARCHAR(9) = "00000001" 

UPDATE TableName1 
SET SSN = @NewSSN 
WHERE SSN = @OldSSN 

UPDATE TableName2 
SET SSN = @NewSSN 
WHERE SSN = @OldSSN 

Как уже упоминалось Blam, это не хорошая практика, чтобы иметь номер социального страхования, перечисленных в более чем 1 стол именно по этой причине. Было бы лучше иметь одну таблицу Client с SSN, а затем использовать вновь созданный ClientId во всех других таблицах.

+1

Вы бы захотели выполнить транзакцию такого рода кода, иначе в случае каких-либо ошибок вы могли бы привести к обновлению некоторых таблиц, а некоторые из них не были. – DeanOC

+0

Хороший вызов, но не уверен, что лучший синтаксис для отката при нескольких обновлениях. – hines

+0

Ваш код сейчас опасен. Это дает иллюзию проверки ошибок, но ошибка @@ сообщает только, что произошло в последнем выполненном заявлении. Итак, в вашем примере, если первое обновление не удалось, а второе сработало, вы не откажетесь от транзакции. Я предлагаю вам посмотреть блоки TRY..CATCH и XACT_ABORT. – DeanOC

0

Используйте это, чтобы сгенерировать все ваши обновления. Возможно, вам придется настроить предложение WHERE.

SELECT 
    'UPDATE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] SET [' + Column_Name + '][email protected] WHERE [' + Column_Name + '][email protected];' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE Column_Name ='SSN' 
  1. Создание хранимой процедуры, которая принимает @OldSSN и @NewSSN в качестве параметров.
  2. Вставить в SQL выше.
  3. Wrap в сделке
Смежные вопросы