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

Откуда: Украина, Винница
Сообщений: 277
7 сен 09, 18:09    [7628546]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 765
Timid,

BOL
7 сен 09, 18:10    [7628551]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Добрый день. Пытаюсь создать триггер (впервые). Триггер должен реагировать на вставку записей в таблицу и при совпадении определённого поля задачей триггера является изменение вставляемого значания на

 [вставляемое_значание] + '_' 
.

create table A
(
	Id			int not null ,
	FIO			varchar (50) not null ,
	constraint PK_A             primary key( Id )
	


);

insert into A(Id,FIO) values(1,'IVANOV');



Триггер следующий соорудился


CREATE	TRIGGER Ins_Name
ON	A
FOR 	INSERT


AS 
SET NOCOUNT ON
 BEGIN
	DECLARE @insrtd_Name char(255)
	SELECT  @insrtd_Name = FIO FROM INSERTED
	IF EXISTS 
		(
		 SELECT 1
		 FROM 	A
		 WHERE 	FIO = @insrtd_Name
		)
	 BEGIN
		SET @insrtd_Name = @insrtd_Name + '_'
		IF LEN(@insrtd_Name) < = 50
		BEGIN
			INSERT  INTO A
			SELECT 	Id		,
				@insrtd_Name	
			FROM	INSERTED
	      			
	 	END	
		ELSE		
		BEGIN	
			PRINT 
					'Отмена вставки: превышение максимально допустимой длины FIO'
		END

		END
 END

Проверяю работу триггера

INSERT INTO A(Id,FIO) 
SELECT 	MAX(Id) + 1 AS Id,
	'IVANOV'	
FROM	A 



При отработке триггера возникает ошибка

Violation of PRIMARY KEY constraint 'PK_A'. Cannot insert duplicate key in object 'A'.
The statement has been terminated.
Ошибка, по всей видимости, возникает из-за инсетра в теле триггера? Или триггер не срабатывает "сам на себя"?

Прочитал следующее
команда INSERT – в таблице inserted содержатся все строки, которые пользователь пытается вставить в таблицу; в таблице deleted не будет ни одной строки; после завершения триггера все строки из таблицы inserted переместятся в исходную таблицу;

"все строки..." - а если строка в таблице inserted должна быть модифицирована и после этого быть вставлена?
7 сен 09, 18:12    [7628561]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
Glory
Member

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

При отработке триггера возникает ошибка

Violation of PRIMARY KEY constraint 'PK_A'. Cannot insert duplicate key in object 'A'.
The statement has been terminated.
Ошибка, по всей видимости, возникает из-за инсетра в теле триггера? Или триггер не срабатывает "сам на себя"?

Прочитал следующее
команда INSERT – в таблице inserted содержатся все строки, которые пользователь пытается вставить в таблицу; в таблице deleted не будет ни одной строки; после завершения триггера все строки из таблицы inserted переместятся в исходную таблицу;

"все строки..." - а если строка в таблице inserted должна быть модифицирована и после этого быть вставлена?

1. Вам нужно прочитать в хелпе про AFTER и про INSTEAD триггеры. Кроме того читать про recursive и nested triggers
2. Зачем проверять длину добавляемых данных, если сервер и так при превышении поля выдаст ошибку и отменит транзакцию ?
7 сен 09, 18:17    [7628580]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 765
Timid,

Я не очень понял а что собственно триггер делает? Вставляет в таблицу уже вставленное значение? Сообщение об ошибке
Violation of PRIMARY KEY constraint 'PK_A'
тебе что-нибудь говорит?
7 сен 09, 18:18    [7628583]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
flexgen
Timid,

Я не очень понял а что собственно триггер делает? Вставляет в таблицу уже вставленное значение? Сообщение об ошибке
Violation of PRIMARY KEY constraint 'PK_A'
тебе что-нибудь говорит?


Насколько я понял, до окончания выполнения триггера, данные находятся в таблице inserted, но они ещё не вставлены в таблицу А.
А РК_А говорит о том, что запись с таким Id уже существует. Но вот на каком этапе СУБД проверяет эти данные? Ведь в инсерте указано max(id) + 1. Получается, что ошибка возникает в теле триггера, так?
7 сен 09, 18:28    [7628609]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Glory
Timid

При отработке триггера возникает ошибка

Violation of PRIMARY KEY constraint 'PK_A'. Cannot insert duplicate key in object 'A'.
The statement has been terminated.
Ошибка, по всей видимости, возникает из-за инсетра в теле триггера? Или триггер не срабатывает "сам на себя"?

Прочитал следующее
команда INSERT – в таблице inserted содержатся все строки, которые пользователь пытается вставить в таблицу; в таблице deleted не будет ни одной строки; после завершения триггера все строки из таблицы inserted переместятся в исходную таблицу;

"все строки..." - а если строка в таблице inserted должна быть модифицирована и после этого быть вставлена?

1. Вам нужно прочитать в хелпе про AFTER и про INSTEAD триггеры. Кроме того читать про recursive и nested triggers
2. Зачем проверять длину добавляемых данных, если сервер и так при превышении поля выдаст ошибку и отменит транзакцию ?


спасибо, Glory! Заменил на INSTEAD OF и заработало :)
7 сен 09, 18:39    [7628652]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Timid
Насколько я понял, до окончания выполнения триггера, данные находятся в таблице inserted, но они ещё не вставлены в таблицу А.
Нет, неправильно.
Слово "AFTER" как переводится? Правильно - "ПОСЛЕ".
Это значит, что к моменту запуска триггера все записи уже вставлены в таблицу.
Правда, транзакция ещё не завершилась, поэтому в случае ошибки её можно откатить.
7 сен 09, 20:37    [7628919]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
iap
Timid
Насколько я понял, до окончания выполнения триггера, данные находятся в таблице inserted, но они ещё не вставлены в таблицу А.
Нет, неправильно.
Слово "AFTER" как переводится? Правильно - "ПОСЛЕ".
Это значит, что к моменту запуска триггера все записи уже вставлены в таблицу.
Правда, транзакция ещё не завершилась, поэтому в случае ошибки её можно откатить.


Я имел в виду замечание "Я не очень понял а что собственно триггер делает? Вставляет в таблицу уже вставленное значение?"
8 сен 09, 10:25    [7629965]     Ответить | Цитировать Сообщить модератору
 Re: Помогите осилить логику выполнения триггера  [new]
PaulYoung
Member

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

давно бы BOL почитали уже на тему "Using the inserted and deleted Tables"
8 сен 09, 10:50    [7630130]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить