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

Откуда:
Сообщений: 2649
Корректен ли такой триггер?

ALTER   TRIGGER Кв_up
ON dbo.Кв
FOR UPDATE 
AS 
IF @@ROWCOUNT>0
BEGIN
IF UPDATE (Б1)
	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',(SELECT Б1 FROM deleted),(SELECT Б1 FROM inserted)
		FROM deleted
		INNER JOIN inserted ON deleted.NKv=inserted.NKv
		WHERE deleted.Б1<>inserted.Б1
	END	
END

PS. Просто если обновляешь таблицу из Access вылезает конфликт записи.
Заранее благодарен.
9 июл 09, 09:43    [7394524]     Ответить | Цитировать Сообщить модератору
 Re: Корректен ли триггер?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vah
Корректен ли такой триггер?

ALTER   TRIGGER Кв_up
ON dbo.Кв
FOR UPDATE 
AS 
IF @@ROWCOUNT>0
BEGIN
IF UPDATE (Б1)
	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',(SELECT Б1 FROM deleted),(SELECT Б1 FROM inserted)
		FROM deleted
		INNER JOIN inserted ON deleted.NKv=inserted.NKv
		WHERE deleted.Б1<>inserted.Б1
	END	
END

PS. Просто если обновляешь таблицу из Access вылезает конфликт записи.
Заранее благодарен.
Нет, некорректен для UPDATE нескольких строк. Ибо кореллированный подзапрос в списке SELECT вернёт более одной записи.
Кроме всего прочего, Б1 может принимать значение NULL? Если да, то использовать оператор "<>" нельзя.
9 июл 09, 09:49    [7394557]     Ответить | Цитировать Сообщить модератору
 Re: Корректен ли триггер?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Кроме всего прочего, Б1 может принимать значение NULL? Если да, то использовать оператор "<>" нельзя.
Точнее, его использовать недостаточно
9 июл 09, 09:51    [7394568]     Ответить | Цитировать Сообщить модератору
 Re: Корректен ли триггер?  [new]
vah
Member

Откуда:
Сообщений: 2649
iap
vah
Корректен ли такой триггер?

ALTER   TRIGGER Кв_up
ON dbo.Кв
FOR UPDATE 
AS 
IF @@ROWCOUNT>0
BEGIN
IF UPDATE (Б1)
	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',(SELECT Б1 FROM deleted),(SELECT Б1 FROM inserted)
		FROM deleted
		INNER JOIN inserted ON deleted.NKv=inserted.NKv
		WHERE deleted.Б1<>inserted.Б1
	END	
END

PS. Просто если обновляешь таблицу из Access вылезает конфликт записи.
Заранее благодарен.
Нет, некорректен для UPDATE нескольких строк. Ибо кореллированный подзапрос в списке SELECT вернёт более одной записи.
Кроме всего прочего, Б1 может принимать значение NULL? Если да, то использовать оператор "<>" нельзя.


а если так?

WHERE isnull(deleted.Б1,0)<>isnull(inserted.Б1,0)
9 июл 09, 09:54    [7394584]     Ответить | Цитировать Сообщить модератору
 Re: Корректен ли триггер?  [new]
vah
Member

Откуда:
Сообщений: 2649
iap
vah
Корректен ли такой триггер?

ALTER   TRIGGER Кв_up
ON dbo.Кв
FOR UPDATE 
AS 
IF @@ROWCOUNT>0
BEGIN
IF UPDATE (Б1)
	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',(SELECT Б1 FROM deleted),(SELECT Б1 FROM inserted)
		FROM deleted
		INNER JOIN inserted ON deleted.NKv=inserted.NKv
		WHERE deleted.Б1<>inserted.Б1
	END	
END

PS. Просто если обновляешь таблицу из Access вылезает конфликт записи.
Заранее благодарен.
Нет, некорректен для UPDATE нескольких строк. Ибо кореллированный подзапрос в списке SELECT вернёт более одной записи.
Кроме всего прочего, Б1 может принимать значение NULL? Если да, то использовать оператор "<>" нельзя.



Думаю так будет красивее

	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',deleted.Б1,inserted.Б1
		FROM deleted
		INNER JOIN inserted  ON deleted.NKv=inserted.NKv
		WHERE isnull(deleted.Б1,0)<>isnull(inserted.Б1,0)
	END
9 июл 09, 10:02    [7394641]     Ответить | Цитировать Сообщить модератору
 Re: Корректен ли триггер?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vah
iap
vah
Корректен ли такой триггер?

ALTER   TRIGGER Кв_up
ON dbo.Кв
FOR UPDATE 
AS 
IF @@ROWCOUNT>0
BEGIN
IF UPDATE (Б1)
	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',(SELECT Б1 FROM deleted),(SELECT Б1 FROM inserted)
		FROM deleted
		INNER JOIN inserted ON deleted.NKv=inserted.NKv
		WHERE deleted.Б1<>inserted.Б1
	END	
END

PS. Просто если обновляешь таблицу из Access вылезает конфликт записи.
Заранее благодарен.
Нет, некорректен для UPDATE нескольких строк. Ибо кореллированный подзапрос в списке SELECT вернёт более одной записи.
Кроме всего прочего, Б1 может принимать значение NULL? Если да, то использовать оператор "<>" нельзя.


а если так?

WHERE isnull(deleted.Б1,0)<>isnull(inserted.Б1,0)
То есть, если поле изменится с 0 на NULL, триггер этого и не заметит?
   deleted.Б1 IS NULL AND inserted.Б1 IS NOT NULL
OR deleted.Б1 IS NOT NULL AND inserted.Б1 IS NULL
OR deleted.Б1<>inserted.Б1
9 июл 09, 10:06    [7394674]     Ответить | Цитировать Сообщить модератору
 Re: Корректен ли триггер?  [new]
vah
Member

Откуда:
Сообщений: 2649
iap
vah
iap
vah
Корректен ли такой триггер?

ALTER   TRIGGER Кв_up
ON dbo.Кв
FOR UPDATE 
AS 
IF @@ROWCOUNT>0
BEGIN
IF UPDATE (Б1)
	BEGIN
		INSERT INTO log_base_sbyt(tabls,users,comp,oper,dat,id_tab,fields,old_val,new_val)
		SELECT 'Кв',SYSTEM_USER,host_name(),'UPDATE',GETDATE(),deleted.NKv,'Б1',(SELECT Б1 FROM deleted),(SELECT Б1 FROM inserted)
		FROM deleted
		INNER JOIN inserted ON deleted.NKv=inserted.NKv
		WHERE deleted.Б1<>inserted.Б1
	END	
END

PS. Просто если обновляешь таблицу из Access вылезает конфликт записи.
Заранее благодарен.
Нет, некорректен для UPDATE нескольких строк. Ибо кореллированный подзапрос в списке SELECT вернёт более одной записи.
Кроме всего прочего, Б1 может принимать значение NULL? Если да, то использовать оператор "<>" нельзя.


а если так?

WHERE isnull(deleted.Б1,0)<>isnull(inserted.Б1,0)
То есть, если поле изменится с 0 на NULL, триггер этого и не заметит?
   deleted.Б1 IS NULL AND inserted.Б1 IS NOT NULL
OR deleted.Б1 IS NOT NULL AND inserted.Б1 IS NULL
OR deleted.Б1<>inserted.Б1


Спасибо!
9 июл 09, 10:34    [7394883]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить