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

Откуда:
Сообщений: 118
есть таблица:
таблица_1
поле_ИД
поле_1
поле_2
поле_3
поле_4

комбинация полей 1-3 должна быть уникальной. то есть если добавляется новая комбинация полей, например
поле_1 = 1
поле_2 = 1
поле_3 = 1
поле_4 = 5,
то уже имеющаяся комбинация полей:
поле_1 = 1
поле_2 = 1
поле_3 = 1
поле_4 = 3 должна удалиться
5 май 11, 10:23    [10608097]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

Откуда:
Сообщений: 118
Ну хоть кто-нибудь!
5 май 11, 11:50    [10608755]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
то уже имеющаяся комбинация полей:
поле_1 = 1
поле_2 = 1
поле_3 = 1
поле_4 = 3 должна удалиться


А если имеется такая же комбинация полей?
5 май 11, 11:55    [10608789]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Glory
Member

Откуда:
Сообщений: 104751
Зачем тут триггер ?
Есть команда MERGE
5 май 11, 11:59    [10608814]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Артём Петросян
Ну хоть кто-нибудь!
Если на поле_1, поле_2, поле_3 нет уникального констрейна, то достаточно сделать триггер с одной командой delete.

Ваш-то вариант какой?

Документацию читали, примеры пробовали понять и переделать под свои таблицы?
5 май 11, 12:01    [10608825]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

Откуда:
Сообщений: 118
alexeyvg
Артём Петросян
Ну хоть кто-нибудь!
Если на поле_1, поле_2, поле_3 нет уникального констрейна, то достаточно сделать триггер с одной командой delete.

Ваш-то вариант какой?

Документацию читали, примеры пробовали понять и переделать под свои таблицы?


смысл понятен. но как получить новые значения. delete будет таким:
delete from table where поле_1=новое_значение_поля_1 and поле_2=новое_значение_поля_ and поле_3=новое_значение_поля_3
но как сослаться на эти значения_новых_полей?
5 май 11, 15:15    [10610624]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Горилла с Нижнего Тагила
Member

Откуда:
Сообщений: 407
Артём Петросян,

используй виртуальную таблицу inserted
Примерно так:
delete t
from
таблица_1 t
inner join
inserted i
on t.поле_1 = i.поле_1 and
t.поле_2 = i.поле_2 and
t.поле_3 = i.поле_3 and
t.Поле_ИД<>i.Поле_ИД
5 май 11, 15:40    [10610928]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Артём Петросян
alexeyvg
Если на поле_1, поле_2, поле_3 нет уникального констрейна, то достаточно сделать триггер с одной командой delete.

Ваш-то вариант какой?

Документацию читали, примеры пробовали понять и переделать под свои таблицы?


смысл понятен. но как получить новые значения. delete будет таким:
delete from table where поле_1=новое_значение_поля_1 and поле_2=новое_значение_поля_ and поле_3=новое_значение_поля_3
но как сослаться на эти значения_новых_полей?
Новые, только что вставленные записи находятся в псевдо-таблице INSERTED.
И в основной таблице они тоже будут на момент срабатывания триггера

Т.е. вам нужно удалить те записи, у которых совпадают поля поле_Н и не совпадают ИД записи

Синтаксис команды delete для нескольких таблиц смотрите опять же в хелпе.
5 май 11, 15:44    [10610974]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

Откуда:
Сообщений: 118
сейчас попробую
5 май 11, 15:49    [10611024]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
Зачем тут триггер ?
Есть команда MERGE
+100

MERGE таблица_1 T
USING (VALUES(1),(1),(1),(5)) NewRecord(поле_1,поле_2,поле_3,поле_4)
ON T.поле_1=NewRecord.поле_1 AND T.поле_2=NewRecord.поле_2 AND T.поле_3=NewRecord.поле_3
WHEN MATCHED THEN UPDATE SET T.поле_4=NewRecord.поле_4
WHEN NOT MATCHED THEN INSERT(поле_1,поле_2,поле_3,поле_4) VALUES(NewRecord.поле_1,NewRecord.поле_2,NewRecord.поле_3,NewRecord.поле_4);
НЕ ПРОВЕРЯЛ!
5 май 11, 15:50    [10611042]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Так и есть - опечатка!
iap
Glory
Зачем тут триггер ?
Есть команда MERGE
+100

MERGE таблица_1 T
USING (VALUES(1,1,1,5) NewRecord(поле_1,поле_2,поле_3,поле_4)
ON T.поле_1=NewRecord.поле_1 AND T.поле_2=NewRecord.поле_2 AND T.поле_3=NewRecord.поле_3
WHEN MATCHED THEN UPDATE SET T.поле_4=NewRecord.поле_4
WHEN NOT MATCHED THEN INSERT(поле_1,поле_2,поле_3,поле_4) VALUES(NewRecord.поле_1,NewRecord.поле_2,NewRecord.поле_3,NewRecord.поле_4);
НЕ ПРОВЕРЯЛ!
5 май 11, 16:02    [10611169]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

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

я уже триггером сделал. вот результат:

ALTER TRIGGER [dbo].[del_same]
   ON  [dbo].[ocenki] 
   for INSERT
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
delete from ocenki where ocenki.chlen in (select chlen from inserted) and
ocenki.nominaciya in (select nominaciya from inserted) and 
ocenki.konkursant in (select konkursant from inserted) and 
ocenki.ocenka not in (select ocenka from inserted)
    -- Insert statements for trigger here

END

merge раньше никогда не использовал. но прямо сейчас обязательно разберусь в нем
5 май 11, 16:15    [10611310]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
не взлетит, если в инсертед будет более чем 1 запись
5 май 11, 16:17    [10611333]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
т.е. результат будет просто непредсказуем.. если уж честно
5 май 11, 16:18    [10611345]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

Откуда:
Сообщений: 118
Maxx
т.е. результат будет просто непредсказуем.. если уж честно

туда данные из асп страницы отправляться будут, так что норм должно быть
5 май 11, 16:20    [10611362]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Maxx
не взлетит, если в инсертед будет более чем 1 запись
Проблема даже не в этом, а в том, что поля проверяются на входимость в inserted независимо.
Тут от них не требуется быть в одной записи.
5 май 11, 16:20    [10611364]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Артём Петросян,

да яж не против ... дето то ваше
5 май 11, 16:21    [10611371]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Maxx
не взлетит, если в инсертед будет более чем 1 запись
Проблема даже не в этом, а в том, что поля проверяются на входимость в inserted независимо.
Тут от них не требуется быть в одной записи.
Хотя, кто его знает. Может, так и задумывалось специально?
5 май 11, 16:21    [10611373]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Артём Петросян
Maxx
т.е. результат будет просто непредсказуем.. если уж честно

туда данные из асп страницы отправляться будут, так что норм должно быть
Какой смысл писать неправильно, да ещё и больше кода??? Типа из принципа пишем "простокод"?

Вам же человек прямо написал готовый вариант, только имена таблиц заменить.
5 май 11, 16:28    [10611440]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Артём Петросян,

declare @t table (i int NOT NULL, j int NOT NULL)
declare @tt table (i int NOT NULL, j int NOT NULL)

insert into @t (i,j) values (1,1), (2,2), (3,3),(4,4)
insert into @tt (i, j) values (1,1), (2,2), (3,3),(1,4), (4,4)

select t.*
from @tt t
  inner join @t t2 on t.i = t2.i and t.j = t2.j
  
select *
from @tt
where i in (select i from @t)
  and j in (select j from @t)  

правда неожиданно ?
5 май 11, 16:33    [10611515]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

Откуда:
Сообщений: 118
iap
Так и есть - опечатка!
iap
пропущено...
+100

MERGE таблица_1 T
USING (VALUES(1,1,1,5) NewRecord(поле_1,поле_2,поле_3,поле_4)
ON T.поле_1=NewRecord.поле_1 AND T.поле_2=NewRecord.поле_2 AND T.поле_3=NewRecord.поле_3
WHEN MATCHED THEN UPDATE SET T.поле_4=NewRecord.поле_4
WHEN NOT MATCHED THEN INSERT(поле_1,поле_2,поле_3,поле_4) VALUES(NewRecord.поле_1,NewRecord.поле_2,NewRecord.поле_3,NewRecord.поле_4);
НЕ ПРОВЕРЯЛ!


я работаю в asp net с sqldatasource. куда там это писать?
5 май 11, 16:36    [10611543]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Артём Петросян,

да нет, можно, конечно, и триггер. Только правильно написать.
К примеру, проапдейтить из джойна с inserted,
а потом проинсертить по условию NOT EXISTS() относительно того же inserted
5 май 11, 16:45    [10611659]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Артём Петросян,

да, я так и не понял, зачем старую запись удалять, а новую вставлять, если можно просто проапдейтить?
5 май 11, 16:47    [10611675]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Артём Петросян
Member

Откуда:
Сообщений: 118
iap
Артём Петросян,

да, я так и не понял, зачем старую запись удалять, а новую вставлять, если можно просто проапдейтить?

а вдруг старой нету. а просто новая добавляется
5 май 11, 16:48    [10611687]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать тригер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Артём Петросян
iap
Артём Петросян,

да, я так и не понял, зачем старую запись удалять, а новую вставлять, если можно просто проапдейтить?

а вдруг старой нету. а просто новая добавляется


а что в етом случае удалять то будете.... сначал продумывают архитектуру ,логику работы ,а патом тока пишут...
если запись есть
  апдейт
если записи нет 
 инсерт 
5 май 11, 16:50    [10611711]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить