Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
Уважаемые мастера!
Помогите советом.
Есть 2 таблицы и обоих кл.поле - [КодТовара]
на одной висит триггер и при обновлении кода в одной, в другой он тоже меняется
SELECT @kod=(SELECT [КодТовара] FROM inserted)

SELECT @kodold=(SELECT [КодТовара] FROM deleted)
UPDATE [Plan] SET [КодТовара]=@kod WHERE ([КодТовара]=@kodold)

но этот триггер не рабоет при обновлении сразу нескольких записей
30 сен 03, 17:39    [358131]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
UPDATE [Plan] SET [КодТовара]=i.[КодТовара] from inserted i inner join deleted d on i.pk=d.pk WHERE (d.[КодТовара]=@kodold)
30 сен 03, 17:47    [358149]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
@kodold не даст вставить несколько записей одновременно
1 окт 03, 09:55    [358650]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
???
UPDATE [Plan] SET [КодТовара]=i.[КодТовара]

from inserted i join
[Plan] p on i.pk=p.pk
1 окт 03, 10:12    [358677]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
to tpg
что имеется в виду
1 окт 03, 10:24    [358701]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 labanga

А какой первичный ключ в таблице, на которой висти трригер, неужели [КодТовара]?
1 окт 03, 10:36    [358727]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
Из-за чего собственно и весь сыр-бор

SELECT @kod=(SELECT [КодТовара] FROM inserted)

SELECT @kodold=(SELECT [КодТовара] FROM deleted)
UPDATE [Plan] SET [КодТовара]=@kod WHERE ([КодТовара]=@kodold)


так работает нормально, но обновлять можно только по 1 записи за раз, а как то же самое сделать для обновления сразу нескольких записей
1 окт 03, 10:56    [358777]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да понятно что вам нужно. Ответьте лучше на вопрос pkarklin-а - "А какой первичный ключ в таблице, на которой висти трригер, неужели [КодТовара]?"
1 окт 03, 10:58    [358783]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
да, тоже КодТовара
1 окт 03, 11:32    [358873]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Тогда разрешите вас спросить, а как тогда связать записи в таблицах inserted и deleted, чтоб можно было сопоставить новое и старое значение [КодТовара]? Если ли еще какой-нибудь кандидат кей?
1 окт 03, 11:35    [358890]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Тогда только по одной записи и надо менять.
1 окт 03, 11:36    [358892]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
тут должгно быть решение, вроде того, чтобы выбирать из deleted [КодТовара],
находить его во 2-й таблице и обновлять из inserted
этот триггер именно это и делает но только по одной записи
SELECT @kod=(SELECT [КодТовара] FROM inserted)

SELECT @kodold=(SELECT [КодТовара] FROM deleted)
UPDATE [Plan] SET [КодТовара]=@kod WHERE ([КодТовара]=@kodold)

а этот триггер обновляет сразу несколько записей, но нехватает опыта сделать такой же для ключевого поля
UPDATE [Plan] SET [ОписаниеТовара]=d.[ОписаниеТовара]

FROM [Plan] t
INNER JOIN (Select [КодТовара], [ОписаниеТовара] From inserted) as d
ON t.[КодТовара] = d.[КодТовара]
1 окт 03, 11:57    [358953]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
тут должгно быть решение, вроде того, чтобы выбирать из deleted [КодТовара],
находить его во 2-й таблице и обновлять из inserted
этот триггер именно это и делает но только по одной записи


Так вот твоя проблемма в том и состоит, что ты меняешь первичный ключ и если нет другого набора полей, уникально определяющих запись, то и нет возможности при групповом апдейте сопоставить старые/новые значания КодТовара. Или переделывай схему данных или меняй по одной записи.
1 окт 03, 12:01    [358966]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
Crip
Member

Откуда:
Сообщений: 2490
Какая версия сервера?
Если 2000, то можно просто воспользоваться RI ON UPDATE CASCADE
1 окт 03, 12:05    [358972]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
И на том спасибо, а так хотелось чуда )))))))
1 окт 03, 12:06    [358977]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Проектировать табличку надо было правильно.
1 окт 03, 12:12    [358987]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
Crip
Member

Откуда:
Сообщений: 2490
Чудо было бы при использовании суррогатного ключа. Это же классический пример из проблем с естественным ключом...
1 окт 03, 12:13    [358990]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
to Crip
а не могли бы Вы по-подробнее написать про RI ON UPDATE CASCADE
1 окт 03, 12:19    [359006]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
Crip
Member

Откуда:
Сообщений: 2490
2labanga
Ну если на пальцах, то это когда при обновлении первичного ключа обновляются все внешние ключи.
Можно сделать прямо в Enterprise Manager установив связь в соответствующей диаграмме и установив свойство Cascade Update Related Fields.
Программно это где-то так.
CREATE TABLE [Test] (

[ID] [int] NOT NULL ,
[Name] [varchar] (50) NOT NULL ,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY] ,
CONSTRAINT [FK_Test_OtherTable] FOREIGN KEY
(
[ID]
) REFERENCES [OtherTable] (
[ID]
) ON UPDATE CASCADE
) ON [PRIMARY]
1 окт 03, 14:01    [359292]     Ответить | Цитировать Сообщить модератору
 Re: Про Update и триггеры  [new]
labanga
Member

Откуда:
Сообщений: 26
А-а-а понятно
Все новое это уже изрядно поднадоевшее старое, просто другими словами(авторство этой версии мое)
Спасибо всем за ответы
1 окт 03, 14:38    [359368]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить