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

Откуда:
Сообщений: 62
Не получается создать триггер, который уничтожал бы записи в sipidip при изменении в account поля account_delete c True на False, т.е. триггер не всего UPDATE, а для update конкретного Пол

MS SQL 2005

Вот мой код (неработающий). Никак не пойму в чем проблема....

Create TRIGGER sipid_deleting
ON dbo.account
AFTER UPDATE OF dbo.account.account_delete

AS
DELETE db_account.dbo.sipidip from db_account.dbo.sipidip where db_account.dbo.account.account_id = db_account.dbo.sipidip.sipidip_id
25 авг 09, 18:05    [7578999]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
при изменении в account поля account_delete c True на False


Ну и где это условие в запросе?! Точнее сравнение значения поля в inserted и deleted?

ЗЫ. Я так понимаю, это строки "True" и "False", ибо в MS SQL нет булевого типа данных.
ЗЫЗЫ. Логика зверская. Делаем UPDATE, а получам DELETE.
25 авг 09, 18:09    [7579020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а где ві нашли такой синтаксис ?
-------------------------------------
Jedem Das Seine
25 авг 09, 18:09    [7579022]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
pkarklin
автор
при изменении в account поля account_delete c True на False


Ну и где это условие в запросе?! Точнее сравнение значения поля в inserted и deleted?

ЗЫ. Я так понимаю, это строки "True" и "False", ибо в MS SQL нет булевого типа данных.
ЗЫЗЫ. Логика зверская. Делаем UPDATE, а получам DELETE.


В том то и дело что таблицы между собой связаны по полям account.account_id=sipidip.sipidip_id , но в account строки не удаляются, а только меняется содержимое поле delete, а в sipidip при изменении значения этого поля связанные строки удаляются. Поэтому действительно делаю UPDATE в account, а получить должен DELETE в sipidip.

Тип поля account.delete - bit.

ALTER TRIGGER [dbo].[planout_deleting]
ON [dbo].[gate]
FOR DELETE
AS
DELETE db_routing.dbo.planout from db_routing.dbo.planout, deleted where db_routing.dbo.planout.planout_id = deleted.gate_id
25 авг 09, 19:34    [7579304]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21520
goldfuzz

FOR DELETE
AS
DELETE db_routing.dbo.planout from db_routing.dbo.planout, deleted where db_routing.dbo.planout.planout_id = deleted.gate_id


Почему теперь триггер FOR DELETE, если вы говорите про update?
25 авг 09, 20:12    [7579377]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Shocker.Pro
goldfuzz

FOR DELETE
AS
DELETE db_routing.dbo.planout from db_routing.dbo.planout, deleted where db_routing.dbo.planout.planout_id = deleted.gate_id


Почему теперь триггер FOR DELETE, если вы говорите про update?


Случайно вставленный код. Не имеет отношения к вопросу.
26 авг 09, 10:04    [7580341]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Поэтому действительно делаю UPDATE в account, а получить должен DELETE в sipidip.


Еще раз спрошу:

DELETE db_routing.dbo.planout from db_routing.dbo.planout, deleted where db_routing.dbo.planout.planout_id = deleted.gate_id

Где здесь:

1. Связь с таблицей inserted;
2. Сравнение значения поля в inserted и deleted?
26 авг 09, 10:07    [7580357]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
Create TRIGGER sipid_deleting
ON dbo.account
AFTER UPDATE

AS
DELETE a 
FROM db_account.dbo.sipidip a 
INNER JOIN dbo.account.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>
26 авг 09, 10:14    [7580389]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
pkarklin
автор
Поэтому действительно делаю UPDATE в account, а получить должен DELETE в sipidip.


Еще раз спрошу:

DELETE db_routing.dbo.planout from db_routing.dbo.planout, deleted where db_routing.dbo.planout.planout_id = deleted.gate_id

Где здесь:

1. Связь с таблицей inserted;
2. Сравнение значения поля в inserted и deleted?


Я писал - этот код (рабочий, кстати) приведен ошибочно.
Пока что я пришел только к такому.

CREATE TRIGGER [dbo].[sipid_deleting]
ON [dbo].[account]
AFTER UPDATE OF account_delete

AS
DELETE db_account.dbo.sipidip from db_account.dbo.sipidip, updated where db_account.dbo.sipidip.sipidip_id=updated.account_id

Но он выдает ошибку синтаксиса возле OF...
Как я понимаю MS SQL 2005 такую конструкцию не принимает.
26 авг 09, 10:51    [7580650]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
goldfuzz


Но он выдает ошибку синтаксиса возле OF...
Как я понимаю MS SQL 2005 такую конструкцию не принимает.

Бинго !! Не понимает он конструкций, которых нет в документации
26 авг 09, 10:53    [7580664]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
goldfuzz
Но он выдает ошибку синтаксиса возле OF...
Как я понимаю MS SQL 2005 такую конструкцию не принимает.


Ну так синтаксис, который оно "понимает", описан в документации в разделе CREATE TRIGGER.
26 авг 09, 10:54    [7580674]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
еще раз
нет у мсскл триггеров отдельно на изменение поля !!!
Ето проверяеться в теле григгера,посему я и спросил где ві такой синтаксис нашли
-------------------------------------
Jedem Das Seine
26 авг 09, 10:54    [7580675]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Glory
Create TRIGGER sipid_deleting
ON dbo.account
AFTER UPDATE

AS
DELETE a 
FROM db_account.dbo.sipidip a 
INNER JOIN dbo.account.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>



Применим только в случае апдейта любого поля в account, а мне нужно - только в случае одно-единственного поля account_delete
26 авг 09, 11:00    [7580720]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
BOL-> COLUMN_UPDATED(), UPDATE() ?
-------------------------------------
Jedem Das Seine
26 авг 09, 11:02    [7580731]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Maxx,

Понял теперь с OF <поле>.... Очень жаль. Буду разбираться дальше.
26 авг 09, 11:02    [7580732]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
goldfuzz
Glory
Create TRIGGER sipid_deleting
ON dbo.account
AFTER UPDATE

AS
DELETE a 
FROM db_account.dbo.sipidip a 
INNER JOIN dbo.account.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>



Применим только в случае апдейта любого поля в account, а мне нужно - только в случае одно-единственного поля account_delete

А какая разница то ? Вам же нужно, чтобы при account_delete = <False> в sipidip не было соответствующих записей ? Или уже нет ?
26 авг 09, 11:02    [7580733]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Glory
goldfuzz
Glory
Create TRIGGER sipid_deleting
ON dbo.account
AFTER UPDATE

AS
DELETE a 
FROM db_account.dbo.sipidip a 
INNER JOIN dbo.account.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>



Применим только в случае апдейта любого поля в account, а мне нужно - только в случае одно-единственного поля account_delete

А какая разница то ? Вам же нужно, чтобы при account_delete = <False> в sipidip не было соответствующих записей ? Или уже нет ?


Запутался, нужно подумать....
DELETE a
FROM db_account.dbo.sipidip a
INNER JOIN dbo.account.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>


Не очень понимаю эту конструкцию... Наверно правильней так...
DELETE a
FROM db_account.dbo.sipidip a
INNER JOIN dbo.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>
26 авг 09, 11:21    [7580860]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Glory
goldfuzz
Glory
Create TRIGGER sipid_deleting
ON dbo.account
AFTER UPDATE

AS
DELETE a 
FROM db_account.dbo.sipidip a 
INNER JOIN dbo.account.account b ON b.account_id = a.sipidip_id AND b.account_delete = <False>



Применим только в случае апдейта любого поля в account, а мне нужно - только в случае одно-единственного поля account_delete

А какая разница то ? Вам же нужно, чтобы при account_delete = <False> в sipidip не было соответствующих записей ? Или уже нет ?


Использую Ваш вариант, немного подкоректированный под мою ситуацию:

CREATE TRIGGER [dbo].[sipidip_deleting]
ON [dbo].[account]
FOR UPDATE
AS
DELETE a
FROM db_account.dbo.sipidip a
INNER JOIN db_account.dbo.account b ON b.account_id = a.sipidip_id AND b.account_delete = 'False'

Выдает ошибку :( "Значения строки обновлены или удалены, либо не делают строку уникальной, либо они изменяют несколько строк". При этом сам запрос удаления РАБОТАЕТ, естественно, ВЕРНО!
DELETE a
FROM db_account.dbo.sipidip a
INNER JOIN db_account.dbo.account b ON b.account_id = a.sipidip_id AND b.account_delete = 'Fasle'



Пробовали свой вариант:

ALTER TRIGGER [dbo].[sipid_deleting_2]
ON [dbo].[account]
AFTER UPDATE

AS
DELETE db_account.dbo.sipidip
FROM db_account.dbo.sipidip db_account.dbo.account
WHERE db_account.dbo.account.account_id = db_account.dbo.sipidip.sipidip_id AND db_account.dbo.account.account_delete = 'True'

Тоже самое... :(
26 авг 09, 12:02    [7581070]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
goldfuzz

Выдает ошибку :( "Значения строки обновлены или удалены, либо не делают строку уникальной, либо они изменяют несколько строк". При этом сам запрос удаления РАБОТАЕТ, естественно, ВЕРНО!

Эта ошибка вашего Access, а не MSSQL
26 авг 09, 12:14    [7581140]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Glory,
У меня аксесса ваще на машине нет :)
26 авг 09, 12:20    [7581186]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
goldfuzz
Glory,
У меня аксесса ваще на машине нет :)

Тем не менее, это все равно ошибка вашего клиентского приложения.
26 авг 09, 12:22    [7581215]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Maxx
BOL-> COLUMN_UPDATED(), UPDATE() ?
-------------------------------------
Jedem Das Seine


Вы имели ввиду нечто подобное?

CREATE TRIGGER [dbo].[sipidip_deleting_2]
ON [dbo].[account]
AFTER UPDATE
AS
DELETE db_account.dbo.sipidip
FROM db_account.dbo.sipidip, UPDATED()
WHERE UPDATED.account_id = db_account.dbo.sipidip.sipidip_id AND UPDATED.account_delete = 'False'
26 авг 09, 12:28    [7581258]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
goldfuzz
Member

Откуда:
Сообщений: 62
Glory
goldfuzz
Glory,
У меня аксесса ваще на машине нет :)

Тем не менее, это все равно ошибка вашего клиентского приложения.


Какая разница - результат отрицательный. Триггер не работает.
26 авг 09, 12:29    [7581269]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
goldfuzz
Glory
goldfuzz
Glory,
У меня аксесса ваще на машине нет :)

Тем не менее, это все равно ошибка вашего клиентского приложения.


Какая разница - результат отрицательный. Триггер не работает.

Не работает ваше приложение, а не триггер. А это очень существенная разница
26 авг 09, 12:30    [7581277]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
set nocount on в триггере напишите, чтобы вашему приложению башню не сносило.
26 авг 09, 12:32    [7581295]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить