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

Откуда:
Сообщений: 531
ALTER TRIGGER [dbo].[trg_InsertUpdateTrip] 
   ON  [dbo].[Trips] 
   AFTER INSERT, UPDATE
AS 
BEGIN
	INSERT INTO TripChecklist(TripId)
    SELECT TripId
	FROM   inserted
	EXCEPT 
	SELECT TripId
	FROM   deleted 
	WHERE  UserId IS NOT NULL
	EXCEPT 
	SELECT TripId
	FROM   TripChecklist
END


И TripCheckList схематично так

CREATE TABLE [dbo].[TripChecklist](
	[TripChecklistId] [int] IDENTITY(1,1) NOT NULL,
	[TripId] [int] NOT NULL,
	[IsTripChanged] [bit] NULL,
 CONSTRAINT [PK_TripChecklist] PRIMARY KEY CLUSTERED 


То есть при правке или создании записи в таблице Trips нам надо добавить запись в TripCheckList
Вот при создании записи в Trip - новая запись добавляется
При изменении записи в Trip - новая запись не добавляется

Где тут что не так с триггером, подскажите плиз
27 фев 14, 14:35    [15639947]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
tual,

а Trips как устроена?
27 фев 14, 14:40    [15639993]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
CREATE TABLE [dbo].[Trips](
	[TripId] [int] IDENTITY(1,1) NOT NULL,
	[LoadAddressId] [int] NOT NULL,
        итд
 CONSTRAINT [PK_Trips] PRIMARY KEY CLUSTERED 
27 фев 14, 14:44    [15640037]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
TripId - это PK? И не меняется в UPDATE?
А записи с UserId IS NULL в Trips есть среди изменяемых?
Тогда первый же EXCEPT вернёт пустой рекордсет, если не ошибаюсь
27 фев 14, 14:44    [15640042]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
iap
TripId - это PK? И не меняется в UPDATE?
А записи с UserId IS NULL в Trips есть среди изменяемых?
Тогда первый же EXCEPT вернёт пустой рекордсет, если не ошибаюсь
Первые два вопроса отпали.
Что там с первым EXCEPT?
И почему на результат этого запроса нельзя посмотреть в студии?
27 фев 14, 14:46    [15640051]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
потому что в синтаксисе триггеров я не секу вообще :)
но вообще UserId везде ожидается не NULL
это ведь залогиненый юзер в систему
27 фев 14, 14:48    [15640068]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31822
tual
При изменении записи в Trip - новая запись не добавляется
Естественно, потому что ИД будет присутствовать в обоих таблицах.

Вам нужно использовать не EXCEPT, а UNION

А вот к таблице TripChecklist сделать EXCEPT, если вы хотите, что бы запись там присутствовала один раз (в чём я не уверен, поскольку TripId в ней не уникально).
27 фев 14, 14:51    [15640092]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31822
tual
потому что в синтаксисе триггеров я не секу вообще :)
У триггеров нет синтаксиса, триггер - это хранимая процедура, которая в свою очередь есть набор запросов. Так что специально "сечь" там нечего.
27 фев 14, 14:51    [15640102]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
я так понимаю что в TripChecklist TripId
попадает при вставке и соответственно уже не попадёт при изменении из-за
....
EXCEPT 
	SELECT TripId
	FROM   TripChecklist
27 фев 14, 14:52    [15640108]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
tual
То есть при правке или создании записи в таблице Trips нам надо добавить запись в TripCheckList
Вот при создании записи в Trip - новая запись добавляется
При изменении записи в Trip - новая запись не добавляется
merge ?
27 фев 14, 14:55    [15640143]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
то есть надо 2 except заменить на 2 Union ?

Да, tripId в таблице чеклистов может быть много раз
27 фев 14, 14:56    [15640149]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
LexusR
я так понимаю что в TripChecklist TripId
попадает при вставке и соответственно уже не попадёт при изменении из-за
....
EXCEPT 
	SELECT TripId
	FROM   TripChecklist
Если UserId IS NOT NULL, то всё отсеется ещё в первом EXCEPT.
Странная таблица TripChecklist.
И смысл триггера не понятен.
27 фев 14, 14:56    [15640155]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
писал триггер не я, поэтому я могу только догадываться что в нем, и насколько это соответствует задаче

поэтому щас командно пообсуждаем, и я думаю еще вернусь :)
27 фев 14, 14:59    [15640188]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
tual
То есть при правке или создании записи в таблице Trips нам надо добавить запись в TripCheckList
alter trigger dbo.trg_InsertUpdateTrip
   ON  dbo.Trips 
   AFTER INSERT, UPDATE
AS 
BEGIN
 set nocount on;

 merge into TripChecklist t
 using inserted s on s.TripId = t.TripId
 when not matched then
  insert (TripId) values (s.TripId);
END
?
27 фев 14, 15:04    [15640240]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
счас решим
внезапно окажется что апдейт вообще не надо )
27 фев 14, 15:08    [15640279]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
invm
tual
То есть при правке или создании записи в таблице Trips нам надо добавить запись в TripCheckList
alter trigger dbo.trg_InsertUpdateTrip
   ON  dbo.Trips 
   AFTER INSERT, UPDATE
AS 
BEGIN
 set nocount on;

 merge into TripChecklist t
 using inserted s on s.TripId = t.TripId
 when not matched then
  insert (TripId) values (s.TripId);
END

?
Дык, небось нужны только TripId реально изменившихся строк?
Надо бы deleted ещё прикрутить
27 фев 14, 15:10    [15640303]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
iap
invm
пропущено...
alter trigger dbo.trg_InsertUpdateTrip
   ON  dbo.Trips 
   AFTER INSERT, UPDATE
AS 
BEGIN
 set nocount on;

 merge into TripChecklist t
 using inserted s on s.TripId = t.TripId
 when not matched then
  insert (TripId) values (s.TripId);
END


?
Дык, небось нужны только TripId реально изменившихся строк?
Надо бы deleted ещё прикрутить
Вот, кстати, EXCEPT - не так глупо.
Ибо PK при апдейте гарантированно совпадают в inserted и deleted при UPDATE,
а при вставке и хотелось все записи inserted получить
27 фев 14, 15:12    [15640322]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
iap
Вот, кстати, EXCEPT - не так глупо.
Ибо PK при апдейте гарантированно совпадают в inserted и deleted при UPDATE,
а при вставке и хотелось все записи inserted получить
Я имею в виду что-то такое:
inserted.* EXCEPT deleted.*
если речь идёт об изменении хотя бы в одном поле, неважно каком.
В противном случае звёздочку надо заменить на список отслеживаемых полей
27 фев 14, 15:14    [15640347]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
iap
iap
Вот, кстати, EXCEPT - не так глупо.
Ибо PK при апдейте гарантированно совпадают в inserted и deleted при UPDATE,
а при вставке и хотелось все записи inserted получить
Я имею в виду что-то такое:
inserted.* EXCEPT deleted.*

если речь идёт об изменении хотя бы в одном поле, неважно каком.
В противном случае звёздочку надо заменить на список отслеживаемых полей
... с обязательным присутствием PK в этом списке
27 фев 14, 15:15    [15640358]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
Вроде как обсудили и решили оставить только Insert
а то ерунда будет )
ALTER TRIGGER [dbo].[trg_InsertUpdateTrip] 
   ON  [dbo].[Trips] 
   AFTER INSERT
AS 
BEGIN
	INSERT INTO TripChecklist(TripId)
        SELECT TripId
	FROM   inserted
	EXCEPT 
	SELECT TripId
	FROM   TripChecklist
END


Это верный код ?
Я на всяк случай оставил проверку что tripId в TripChecklist должен быть уникальным
27 фев 14, 15:19    [15640402]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
tual
Вроде как обсудили и решили оставить только Insert
а то ерунда будет )
ALTER TRIGGER [dbo].[trg_InsertUpdateTrip] 
   ON  [dbo].[Trips] 
   AFTER INSERT
AS 
BEGIN
	INSERT INTO TripChecklist(TripId)
        SELECT TripId
	FROM   inserted
	EXCEPT 
	SELECT TripId
	FROM   TripChecklist
END



Это верный код ?
Я на всяк случай оставил проверку что tripId в TripChecklist должен быть уникальным
UPDATE [dbo].[Trips]
SET [LoadAddressId]=[LoadAddressId];
Вся таблица [dbo].[Trips] окажется в [dbo].[TripChecklist].
Если там этих записей ещё не было, конечно.
И любые следующие UPDATEы будут проигнорированы,
как Вам уже объясняли...
Нормально?
27 фев 14, 15:23    [15640453]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
iap
tual
Вроде как обсудили и решили оставить только Insert
а то ерунда будет )
ALTER TRIGGER [dbo].[trg_InsertUpdateTrip] 
   ON  [dbo].[Trips] 
   AFTER INSERT
AS 
BEGIN
	INSERT INTO TripChecklist(TripId)
        SELECT TripId
	FROM   inserted
	EXCEPT 
	SELECT TripId
	FROM   TripChecklist
END




Это верный код ?
Я на всяк случай оставил проверку что tripId в TripChecklist должен быть уникальным
UPDATE [dbo].[Trips]
SET [LoadAddressId]=[LoadAddressId];

Вся таблица [dbo].[Trips] окажется в [dbo].[TripChecklist].
Если там этих записей ещё не было, конечно.
И любые следующие UPDATEы будут проигнорированы,
как Вам уже объясняли...
Нормально?
Хотя, реально всё осталось в прежнем виде на своих местах
27 фев 14, 15:24    [15640467]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
не не, мы порешили никаких апдейтов
ктото предыдущий программист нам оставил не сильно рабочий код который ввел в заблуждение

то есть нужен триггер который при создании записи в trips создаст запись в tripchecklist с тем же tripid

на всякий случай (чего быть не должно вообще то) надо добавлять запись в tripchecklist если нет там еще такого tripID
27 фев 14, 15:26    [15640488]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
tual
Member

Откуда:
Сообщений: 531
кстати да
при удалении записи из trips надо бы и из чеклиста удалить строку с tripid тем же
27 фев 14, 15:27    [15640501]     Ответить | Цитировать Сообщить модератору
 Re: Триггер чтоли не работает ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Зачем TripCheckList вообще нужна?
Все вставленные записи и так хранятся в Trips
Логировать надо изменённые и удалённые записи
27 фев 14, 15:31    [15640553]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить