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

Откуда: Msk
Сообщений: 582
Нужно триггером изменить значение, которое вставляется.
Сначала я делаю проверку и если проверка пройдена, то меняю значение.
Не понимаю, как мне сделать изменение того значения, которое вставляется

/************************************************************
 * Code formatted by SoftTree SQL Assistant © v6.0.86
 * Time: 03.09.2015 12:47:18
 ************************************************************/

-- ================================================
-- Для вычисления значения идентификатор плательщика
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[tr_calc_PAYER_IDENTIFIER]
ON [dbo].[EPS_EXT_PAYMENT]
FOR  INSERT
AS
	DECLARE @type_object VARCHAR(20)
	DECLARE @PAYER_IDENTIFIER VARCHAR(25)
	BEGIN
		--вычисляем и меняем PAYER_IDENTIFIER только для EPS
		SET @type_object = (
		        SELECT type_object
		        FROM   INSERTED
		    )
		
		IF @type_object = 'eps'
		BEGIN
		    SET @PAYER_IDENTIFIER = (
		            SELECT PAYER_IDENTIFIER
		            FROM   INSERTED
		        )
		    --если PAYER_IDENTIFIER <>25 знакам тогда считаем это значение "старым форматом" и меняем на новое
		    IF LEN(@PAYER_IDENTIFIER) <> 25
		    BEGIN
		        UPDATE INSERTED
		        SET    PAYER_IDENTIFIER = (
		                   REPLACE (
		                       PAYER_IDENTIFIER,
		                       ';' -- Что заменяем (пробел)
		                       ,
		                       '' -- Чем заменяем (пустая строка)
		                   )
		               ) + REPLICATE(0, 23 -LEN(PAYER_IDENTIFIER)) + '643'
		    END
		END
	END
GO


получаю ошибку: Сообщение 286, уровень 16, состояние 1, процедура tr_calc_PAYER_IDENTIFIER, строка 28
The logical tables INSERTED and DELETED cannot be updated.
3 сен 15, 15:06    [18104651]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
xenix
Guest
Как мне помнится, в MS SQL Server before-триггеров нет
3 сен 15, 15:08    [18104661]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
ну так нельзя его апдейтить, делайте обновление самой исходной таблицы
3 сен 15, 15:08    [18104665]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
вообще компот :(
xenix
Как мне помнится, в MS SQL Server before-триггеров нет

indead of называються

По теме - в inseterd запросто может быть более 1й записи...
		        UPDATE INSERTED
		        SET    PAYER_IDENTIFIER = (
		                   REPLACE (
		                       PAYER_IDENTIFIER,
		                       ';' -- Что заменяем (пробел)
		                       ,
		                       '' -- Чем заменяем (пустая строка)
		                   )
		               ) + REPLICATE(0, 23 -LEN(PAYER_IDENTIFIER)) + '643'


Почему такое простое изменение в строке не сделать сразу ? Зачем вам триггер то ?
Ну и про все остальное вам в сообьщение об ошибке уже написали
3 сен 15, 15:14    [18104707]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
1. instead of trigger вам в руки
2. inserted может содержать более 1 записи.. мало тог8о что в перемоной будет шо поппало - так и апдейт наступит для всего. НО НЕ НАСТУПИТ - ибо нельзя :)
3. Зачем для пдейта строки вообще триггер то нужен ? Почему сразу не передавать нормальное значние то ?
3 сен 15, 15:17    [18104744]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Почему такое простое изменение в строке не сделать сразу ? Зачем вам триггер то ?

потому что доступа к приложению нет. есть только доступ к БД
3 сен 15, 15:20    [18104777]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
клево у меня сегодня форум работает ) оба сообщения с моей стороны были как неотправленые
3 сен 15, 15:22    [18104802]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Господа, спасибо за оперативные консультации.
Триггер стал выглядеть так:

-- ================================================
-- Для вычисления значения идентификатор плательщика
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[tr_calc_PAYER_IDENTIFIER]
ON [dbo].[EPS_EXT_PAYMENT]
   [b]INSTEAD OF INSERT[/b]
AS
	DECLARE @type_object VARCHAR(20)
	DECLARE @PAYER_IDENTIFIER VARCHAR(25)
	DECLARE @ID_EXT_PAYMENT INT
	BEGIN
		SET @ID_EXT_PAYMENT = (
		        SELECT ID_EXT_PAYMENT
		        FROM   INSERTED
		    )
		
		--вычисляем и меняем PAYER_IDENTIFIER только для EPS
		SET @type_object = (
		        SELECT type_object
		        FROM   INSERTED
		    )
		
		IF @type_object = 'eps'
		BEGIN
		    SET @PAYER_IDENTIFIER = (
		            SELECT PAYER_IDENTIFIER
		            FROM   INSERTED
		        )
		    --если PAYER_IDENTIFIER <>25 знакам тогда считаем это значение "старым форматом" и меняем на новое
		    IF LEN(@PAYER_IDENTIFIER) <> 25
		    BEGIN
		        UPDATE [b]EPS_EXT_PAYMENT[/b]
		        SET    PAYER_IDENTIFIER  = (
		                   REPLACE (
		                       PAYER_IDENTIFIER,
		                       ';' -- Что заменяем (пробел)
		                       ,
		                       '' -- Чем заменяем (пустая строка)
		                   )
		               ) + REPLICATE(0, 23 -LEN(PAYER_IDENTIFIER)) + '643'
		        WHERE  ID_EXT_PAYMENT    = @ID_EXT_PAYMENT
		    END
		END
	END
3 сен 15, 15:34    [18104898]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Glory
Member

Откуда:
Сообщений: 104751
NewIvanovec
Триггер стал выглядеть так:

Ваш триггер будет работать неправильно при добавлении нескольких записей одновременно
Да он и сейчас неправильно рабоатет - что вы апдейдите, если вы ничего не добавили в таблицу ?

Сообщение было отредактировано: 3 сен 15, 15:37
3 сен 15, 15:36    [18104911]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
SET @ID_EXT_PAYMENT = (
		        SELECT ID_EXT_PAYMENT
		        FROM   INSERTED
		    )
		
		--вычисляем и меняем PAYER_IDENTIFIER только для EPS
		SET @type_object = (
		        SELECT type_object
		        FROM   INSERTED
		    )


а если несколько записей вставляются?
3 сен 15, 15:36    [18104918]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
млин...когда уже люди начнут читать документацию то ?
3 сен 15, 15:40    [18104953]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Maxx
млин...когда уже люди начнут читать документацию то ?

после подобных постов
3 сен 15, 15:43    [18104975]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Konst_One
SET @ID_EXT_PAYMENT = (
		        SELECT ID_EXT_PAYMENT
		        FROM   INSERTED
		    )
		
		--вычисляем и меняем PAYER_IDENTIFIER только для EPS
		SET @type_object = (
		        SELECT type_object
		        FROM   INSERTED
		    )


а если несколько записей вставляются?


мне почему-то кажется что несколько записей не будет, но
подскажите пожалуйста, как учесть если будет несколько записей.
3 сен 15, 16:11    [18105045]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Glory
Member

Откуда:
Сообщений: 104751
NewIvanovec
подскажите пожалуйста, как учесть если будет несколько записей.

работать с таблицами, а не с переменными
Весь ваш "паровоз" пишется в один запрос
3 сен 15, 16:13    [18105058]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Glory
NewIvanovec
подскажите пожалуйста, как учесть если будет несколько записей.

работать с таблицами, а не с переменными
Весь ваш "паровоз" пишется в один запрос


не покажите как можно в один запрос...а то сам не догадаюсь
3 сен 15, 17:09    [18105226]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
UPDATE E
SET E.PAYER_IDENTIFIER = REPLACE(E.PAYER_IDENTIFIER,';','')+ REPLICATE(0, 23-LEN(E.PAYER_IDENTIFIER)) + '643'
FROM 
	EPS_EXT_PAYMENT E INNER JOIN INSERTED I 
		ON E.ID_EXT_PAYMENT = I.ID_EXT_PAYMENT
WHERE
	I.type_object = 'eps' AND 
	LEN(I.PAYER_IDENTIFIER) <> 25


как то так...
3 сен 15, 17:58    [18105320]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Maxx
1. instead of trigger вам в руки
Ну и нафига вы человеку instead of то предложили?
3 сен 15, 23:21    [18105955]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Mind
Maxx
1. instead of trigger вам в руки
Ну и нафига вы человеку instead of то предложили?

я вовсе не предлагал , я отвечал на вот ето
xenix
Как мне помнится, в MS SQL Server before-триггеров нет
4 сен 15, 09:29    [18106681]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
xenix
Guest
автор
я вовсе не предлагал , я отвечал на вот ето

Согласен. Был неправ
4 сен 15, 09:32    [18106706]     Ответить | Цитировать Сообщить модератору
 Re: нужно триггером перед добавлением записи поменять значение на нужно  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 582
Большое спасибо за помощь
15 сен 15, 12:03    [18150521]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить