Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Update двух таблиц 
:(
    Опции темы
Pankon
Дата 23.1.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Нужно обновить записи двух таблиц, 
причем
- вторую обновлять, если в первой обновилась точно одна запись;
- если вторая не обновляется(ошибка или обновляется более одной записи или ноль записей), тогда и первую вернуть в исходное положение(вероятно BEGIN TRANSACTION).



Это сообщение отредактировал(а) Pankon - 23.1.2007, 12:48
PM MAIL   Вверх
Dremlin
Дата 23.1.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Цитата(Pankon @  23.1.2007,  11:45 Найти цитируемый пост)
вероятно BEGIN TRANSACTION

Похоже на то. Что-то вроде:
Код

BEGIN TRANSACTION
UPDATE Table1 SET Field1 = 'SomeValue1' WHERE 1 = 1
IF @@ROWCOUNT = 1
BEGIN
    UPDATE Table2 SET Field2 = 'SomeValue2' WHERE 2 = 2
    IF @@ROWCOUNT = 1
        COMMIT TRANSACTION
    ELSE
        ROLLBACK TRANSACTION
END
ELSE
    ROLLBACK TRANSACTION


Это сообщение отредактировал(а) Dremlin - 23.1.2007, 13:21
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Pankon
Дата 23.1.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Dremlin, спасибо...


А если четыре таблицы... ? smile 

Довольно громоздкий поличается код...


Есть ли другие решения?
PM MAIL   Вверх
Dremlin
Дата 23.1.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Цитата(Pankon @  23.1.2007,  12:37 Найти цитируемый пост)
А если четыре таблицы... ? smile 
Довольно громоздкий поличается код...

А кому сейчас легко  smile 
Цитата(Pankon @  23.1.2007,  12:37 Найти цитируемый пост)

Есть ли другие решения? 

Ты бы обрисовал задачу более общо, что-ли... Может и найдем другие  smile 
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Pankon
Дата 23.1.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



А если так 
Код

BEGIN TRANSACTION

UPDATE Table1 SET Field1 = 'SomeValue1' WHERE 1 = 1
SELECT @rowcount1 = @@ROWCOUNT

UPDATE Table2 SET Field1 = 'SomeValue1' WHERE 1 = 1
SELECT @rowcount2 = @@ROWCOUNT

UPDATE Table3 SET Field1 = 'SomeValue1' WHERE 1 = 1
SELECT @rowcount3 = @@ROWCOUNT

UPDATE Table4 SET Field1 = 'SomeValue1' WHERE 1 = 1
SELECT @rowcount4 = @@ROWCOUNT

IF @rowcount1 = 1  AND @rowcount2 = 1  AND @rowcount3 = 1  AND @rowcount4 = 1 
        COMMIT TRANSACTION
    ELSE
        ROLLBACK TRANSACTION
END

PM MAIL   Вверх
Dremlin
Дата 23.1.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Цитата(Pankon @  23.1.2007,  13:23 Найти цитируемый пост)
А если так 

Если работает и тебя это устраивает, то почему бы и нет?  smile 
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Pankon
Дата 23.1.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Dremlin @  23.1.2007,  14:29 Найти цитируемый пост)
Если работает

еще не пробовал...
PM MAIL   Вверх
Pankon
Дата 23.1.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Dremlin @  23.1.2007,  13:43 Найти цитируемый пост)
Ты бы обрисовал задачу более общо, что-ли... 

Курсор перебирает записи одной таблицы по определенному критерию(SELECT f1,f2,Id1,Id2 FROM T1 WHERE f5=0).
Нужно
Код

Если f1=1 
ТО
  если f2=1 то
       Update T2 Set Count1_1=Count1_1+1 Where Id=Id1
       Update T1 Set f5=1, DateOfProceed=GetDate() WHERE Из текущего курсора
  иначе
       Update T2 Set Count1_2=Count1_2+1 Where Id=Id1
       Update T1 Set f5=1, DateOfProceed=GetDate() WHERE Из текущего курсора
  end
ИНАЧЕ
  если f2=1 то
       Update T2 Set Count2_1=Count2_1+1 Where Id=Id1
       Update T3 Set Acctiv=0, Thing='Nothing'  Where Id=Id2
       Update T4 Set Thing1='Nothing1'  Where Id=Id2
       Update T1 Set f5=1, DateOfProceed=GetDate() WHERE Из текущего курсора
  иначе
       Update T2 Set Count2_2=Count2_2+1 Where Id=Id1
       Update T3 Set Acctiv=0, Thing='Nothing'  Where Id=Id2
       Update T4 Set Thing1='Nothing1'  Where Id=Id2
       Update T1 Set f5=1, DateOfProceed=GetDate() WHERE Из текущего курсора
  end
END

Примерно так я уже сделал ...
Нехватает только "безопасности"..., поэтому и задал этот вопрос
Процедура будет запускаться 1 раз в два часа. 
Обращение(чтение, запись) к базе (в том числе к перечисленным таблицам) происходит постоянно из разных приложений, сервисов и пользователей. Поэтому вероятность "блокировок" велика.... Ясно что нужно применать транзакции...
ХОТЕЛОСь БЫ иметь оптимальный код и генерировать как можно меньше "блокировок", что бы не мешать работе других приложений...



PM MAIL   Вверх
Dremlin
Дата 23.1.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Цитата(Pankon @  23.1.2007,  13:59 Найти цитируемый пост)
Процедура будет запускаться 1 раз в два часа.

Может лучше триггер(ы) написать on insert(update) на Т1, который(е) обновлял(и) бы таблы Т2-4 в зависимости от fx "на лету" без всяких процедур и курсоров?


--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Pankon
Дата 23.1.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Dremlin @  23.1.2007,  16:33 Найти цитируемый пост)
лучше триггер
 не пойдет... (Консервативные традиции фирмы...)

PM MAIL   Вверх
Dremlin
Дата 23.1.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Цитата(Pankon @  23.1.2007,  15:47 Найти цитируемый пост)
 не пойдет... (Консервативные традиции фирмы...)

Понимаю, сам без триггеров работаю, по тем же причинам...  smile 
В общем, предлагаю запускать эту процедуру раз в сутки в 03:00, когда с базой никто не работает.
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Pankon
Дата 23.1.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Dremlin @  23.1.2007,  16:57 Найти цитируемый пост)
процедуру раз в сутки
 Negative

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0800 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.