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

Откуда:
Сообщений: 25
Доброго времени суток, форумчане! Возникла проблема. Необходимо сделать триггер для каскадного UPDATE. Т.е. есть первая таблица в которой есть пара атрибутов, один из которых имеет первичный ключ, во второй таблице есть внешний ключ ссылающийся на упоминаемый. Необходимо сделать возможным, чтобы при изменении данных в первой таблице изменялись данные во второй. Как это осуществить? Просто просто незнаю как можно обойти, собственно ограничения. Возможно надо убирать с отрибутку пометку первичного ключа, изменять, а потом ставить обратно. Но опять же, даже если этот вариант верен, незнаю как осуществить.
Тоже самое надо сделать и для DELETE, но там я думаю будет по аналогии.

Заранее большое спасибо!
17 дек 12, 19:41    [13645489]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
Dimcore,

эээ ..., а понятие "каскадные операции", тебе знакомо ?

нуу, там всякие - ON DELETE CASCADE / ON UPDATE CASCADE ?

http://msdn.microsoft.com/en-us/library/ms186973(v=sql.105).aspx
17 дек 12, 19:44    [13645510]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Требуют триггерами :(
17 дек 12, 20:01    [13645573]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
Dimcore
Требуют триггерами :(

кто требует ? "слать" нужно с такими требованиями !

давай сначала
какая, во-первых, версия сервера ? я сильно сомневаюсь, что < 2000
тогда такая опция как каскаде, уже есть у твоего FOREIGN KEY-я
вот у этого
Dimcore
есть внешний ключ ссылающийся на упоминаемый

просто у него сейчас установленно "поведение" - NONE - запрет изменений

так зачем же создавать в БД ещё один объект (триггер), если достаточно просто "выставить" правильное поведение у имееющегося объекта FOREIGN KEY ??
(это даже не касаясь вопроса, как этот "запрет изменений" обходить)
17 дек 12, 20:28    [13645674]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Хех. Препод по СУБД))) потому надо триггерами(
17 дек 12, 20:40    [13645725]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Ах да, версия 2008
17 дек 12, 20:41    [13645730]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
Dimcore
Хех. Препод по СУБД))) потому надо триггерами(

хм :))
1
FOREIGN KEY - нужно убрать
2
с DELETE - всё просто
в триггере after delete T1
delete T2 
from T2 inner join deleted d on T2.ref_f=d.f

3
а вот с этим, имхо - просто не будет
Dimcore
Необходимо сделать триггер для каскадного UPDATE. Т.е. есть первая таблица в которой есть пара атрибутов, один из которых имеет первичный ключ, во второй таблице есть внешний ключ ссылающийся на упоминаемый. Необходимо сделать возможным, чтобы при изменении данных в первой таблице изменялись данные во второй.

т.е. в T1 изменяется ПК, правильно понимаю ?
имхо, в таком случае, можно будет сделать аналог ON UPDATE CASCADE, только в случае, если в таблице есть "альтернативный" ПК,
и то, если изменятся в запросе будет только ПК (а не ПК и "альтернативный" ПК)

самому даже интересно стало ... ))
17 дек 12, 21:10    [13645873]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
qwerty112
3
а вот с этим, имхо - просто не будет

ещё идин "вариант" "надумал",
в триггере UPDATE - "разворачивать" если изменяется больше чем 1-на запись,
а с одной записью просто
17 дек 12, 21:27    [13645923]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Ну БД имеет такой вид:

1 .|Внешний ключ|...|...| куча других атрибутов |
^
|
|
2. |Первичный ключ|...|

Ну, естесственно, отношение 1 ко многим

Альтернативных ключей нет.

Т.е. задача сводиться к тому чтобы при изменении значения первичного ключа это значение поменялось и в другой таблице.

qwerty112
FOREIGN KEY - нужно убрать

Это всмысле на время работы триггера, а потом вернуть назад?

Ну я так понимаю просто так нельзя поменять первичный ключ, ну или хотябы снять с него на время перичность, а потом вернуть?
17 дек 12, 23:26    [13646212]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
Dimcore
qwerty112
FOREIGN KEY - нужно убрать

Это всмысле на время работы триггера, а потом вернуть назад?

Ну я так понимаю просто так нельзя поменять первичный ключ, ну или хотябы снять с него на время перичность, а потом вернуть?

FOREIGN KEY - это не первичный ключ
это - внешний ключ, - "во второй таблице есть внешний ключ ссылающийся на упоминаемый"

никакую "перичность" с ПК снимать не нужно,
она никак не мешает
"мешает" контроль целостности, который задаёт FOREIGN KEY - его проверка будет выполнятся ДО срабатывания триггера
а так как его (FK) функции, в твоей задаче, будут выполнять триггеры, то он просто не нужен
17 дек 12, 23:41    [13646251]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
qwerty112
Dimcore
пропущено...

Это всмысле на время работы триггера, а потом вернуть назад?

Ну я так понимаю просто так нельзя поменять первичный ключ, ну или хотябы снять с него на время перичность, а потом вернуть?

FOREIGN KEY - это не первичный ключ
это - внешний ключ, - "во второй таблице есть внешний ключ ссылающийся на упоминаемый"

никакую "перичность" с ПК снимать не нужно,
она никак не мешает
"мешает" контроль целостности, который задаёт FOREIGN KEY - его проверка будет выполнятся ДО срабатывания триггера
а так как его (FK) функции, в твоей задаче, будут выполнять триггеры, то он просто не нужен


То что foreign - это внешний ключ, то я в курсе. Просто я подумал, что его тоже надо на время убрать.

Т.е. как я понял, надо просто выпилить внешний ключ вообще и тогда в триггере просто менять соответствующие значения можно будет без проблем?
Если так, то значит надо будет кроме DELETE и UPDATE триггеров ещё и INSERT сделать?
17 дек 12, 23:46    [13646263]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
Dimcore
Т.е. как я понял, надо просто выпилить внешний ключ вообще и тогда в триггере просто менять соответствующие значения можно будет без проблем?
Если так, то значит надо будет кроме DELETE и UPDATE триггеров ещё и INSERT сделать?


>> надо просто выпилить внешний ключ вообще

да

>> и тогда в триггере просто менять соответствующие значения можно будет без проблем?

нуу так себе, "без проблем"
для UPDATE - я лично, вижу рабочий вариант, только если одновременно будет менятся не более одной записи, ...
а это, конечно "полнейшая хрень"

ну вот сам посмотри
было - deleted
id
1
2
3


стало - inserted
id
3
2
1


какой id на какой поменялся ??
17 дек 12, 23:54    [13646273]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
qwerty112
Guest
Dimcore
Если так, то значит надо будет кроме DELETE и UPDATE триггеров ещё и INSERT сделать?

зачем ?
что такого нужно в INSERT делать ?
17 дек 12, 23:57    [13646281]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
[quot qwerty112]
Dimcore
>> и тогда в триггере просто менять соответствующие значения можно будет без проблем?

нуу так себе, "без проблем"
для UPDATE - я лично, вижу рабочий вариант, только если одновременно будет менятся не более одной записи, ...
а это, конечно "полнейшая хрень"

ну вот сам посмотри
было - deleted
id
1
2
3


стало - inserted
id
3
2
1


какой id на какой поменялся ??


Так UPDATE же обычно происходит у одной строки только. Ну а по ней зависимые впринципе найти можно.

INSERT сделать, чтобы сохранить целостность. Чтобы в таблицу 1 нельзя было добавить данные с внешним ключём (уже мнимым) отличным от данных в т.2
18 дек 12, 09:02    [13646824]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
В т.2 мы ж за раз будем менять только 1 строку, ну а в другой таблице несколько.
Ищем значение из таблицы deleted в т.1 и меняем. Разве не так?
18 дек 12, 09:06    [13646841]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Dimcore
В т.2 мы ж за раз будем менять только 1 строку ... Разве не так?

Нет, не так. Кто мешает написать запрос UPDATE, изменяющий хоть все строки таблицы?
В ваших таблицах случайно нет уникального индекса по полю со свойством IDENTITY? Если есть, то в триггере можно делать связку по условию inserted.id = deleted.id, ибо identity-поле проапдейтить нельзя. При желании в identity-поле (если нет никаких дополнительных ограничений) можно вставить дублирующиеся значения, но с этим будет бороться уникальный индекс.
18 дек 12, 09:25    [13646934]     Ответить | Цитировать Сообщить модератору
 Re: Триггер для каскадного UPDATE  [new]
Dimcore
Member

Откуда:
Сообщений: 25
Ок! Обоим большое спасибо, буду пробывать!
19 дек 12, 01:12    [13651687]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить