powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер срабатывает только на первый Insert
16 сообщений из 16, страница 1 из 1
Триггер срабатывает только на первый Insert
    #32018701
KStep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знающие люди, помогите пожалуста!!!
Триггер на Insert срабатывает только на первую запись, а последующие игнорирует, т.е. если задать для внесения данных в таблицу
insert into (...) select top 1 (..) from (..) все классно, но если
insert into (...) select top 2 (..) from (..) , то он обрабатывае только первую запись, а следующие пропускает.
Что не так????
Заранее спасибо.
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018706
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам повезло!
У меня триггер обрабатывает только 5-ю запись:
create trigger MyTrigger on MyTable
for insert
as
UPADTE MyTable2
SET fld=1
WHERE ID = 5
GO
Представляете??? Мелкософт!!! М$!!!

Присылайте текст триггера, будем в форуме разбираться.
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018707
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 alexeyvg
Да ладно Вам, человек просто новичек,я свой первый триггер тоже написал для обработки одной записи
FoxPro понимаете жив

2 KStep
Я просто уверен, что при написании триггера, Вы не учли того момента, что триггер срабатывает один раз, вставляете Вы 1 запись, или 100000.
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018711
Kstep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alexeyvg
Шутка удалась Гуру говоришь...
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018716
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kstep
Ну дык, нашел ошибку то?
Если нет, давайте код
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018721
Kstep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Genady
Саму ошибку определил, к сожалению, пока не нашел пути решения проблемы. Вставляется не первая, а последняя строка. По всей видимости берется только последняя запись из табл. insert

CREATE TRIGGER [Ip] ON [MspSrvLog_test]
FOR INSERT
AS
declare @IpChar char(15)
declare @IpCharNew char(12)
declare @IpKey int
Declare @Ip char(3)
Declare @IpTemp char(15)

select @IpCharNew=''

-- по-моему проблема в этом Select'е
select @IpChar=inserted.ClientIp, @IpKey=inserted.[key]
from MspSrvLog_test, inserted
where MspSrvLog_test.[key]= inserted.[key]



if CharIndex('.',@IpChar)>0
Begin
select @IpChar = Rtrim(@IpChar) +'.'
while @ipChar <>''
begin
select @ipTemp = Left(@IpChar,CharIndex('.',@IpChar)-1)
Select @Ip = left('000',3-Len(@ipTemp)) + @ipTemp
select @IpChar= SubString(@IpChar,CharIndex('.',@IpChar)+1,12)
select @IpCharNew = rtrim(@IpCharNew) + @Ip
end

update MspSrvLog_test
set ClientIpNew = @IpCharNew
where MspSrvLog_test.[key]=@IpKey
End
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018723
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-- по-моему проблема в этом Select'е
select @IpChar=inserted.ClientIp, @IpKey=inserted.[key]
from MspSrvLog_test, inserted
where MspSrvLog_test.[key]= inserted.[key]

Да проблема в нем, в переменную нельзя вставить массив значений, на то она и переменная.
Исходя из вашего кода, мне кажется нужно переписать весь триггер, подозреваю, что можно обойтись без цикла, опишите подробнее что должен делать триггер.

P.S. Попробуйте отойти от мышления построчной обработки строк, SQL оперирует не строками, а наборами строк, частные случаи которых могут быть пустой набор или набор состоящий из одной строки.
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018725
Kstep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача в том чтобы преобразовать ip адреса, который пишет в базу MsProxy в вид в котором их можно было бы сортировать и задавать в запросе промежуток адресов. Т.е. перевести 112.78.66.1 в 112078066001. Первое что пришло в голову триггер на insert. База может быть несколько гигов так что желательно преобразовывать на лету(т.е. в момент записи). А цыкл нужен для преобразования IP из одного вида в другой.
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018730
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не мешало бы уточнить версию SQL-сервера. Твоя задача наиболее изящно решается на SQL2000 с помощью instead-триггера. А вообще лично я бы сделал наоборот. В таблице хранил бы четыре раздельных поля (каждое типа tinyint), а через VIEW объединял бы их в одно (если в этом действительно есть необходимость, в чем я очень сомневаюсь).
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018732
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кстати и статья по этому поводу
Хранение и сортировка адресов IP
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018733
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё можно переписать триггер без цикла:

CREATE TRIGGER [Ip] ON [MspSrvLog_test]
FOR INSERT
AS

update MspSrvLog_test
set ClientIpNew = ClientIp
from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key]

update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = '00' + MspSrvLog_test.ClientIpNew from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where substring(MspSrvLog_test.ClientIpNew, 2, 1) = '.'
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = '0' + MspSrvLog_test.ClientIpNew from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where substring(MspSrvLog_test.ClientIpNew, 3, 1) = '.'
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = left(MspSrvLog_test.ClientIpNew, 4) + '00' + substring(MspSrvLog_test.ClientIpNew, 5, 100) from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where substring(MspSrvLog_test.ClientIpNew, 6, 1) = '.'
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = left(MspSrvLog_test.ClientIpNew, 4) + '0' + substring(MspSrvLog_test.ClientIpNew, 5, 100) from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where substring(MspSrvLog_test.ClientIpNew, 7, 1) = '.'
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = left(MspSrvLog_test.ClientIpNew, + '00' + substring(MspSrvLog_test.ClientIpNew, 9, 100) from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where substring(MspSrvLog_test.ClientIpNew, 10, 1) = '.'
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = left(MspSrvLog_test.ClientIpNew, + '0' + substring(MspSrvLog_test.ClientIpNew, 9, 100) from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where substring(MspSrvLog_test.ClientIpNew, 11, 1) = '.'
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = left(MspSrvLog_test.ClientIpNew, 12) + '00' + substring(MspSrvLog_test.ClientIpNew, 13, 100) from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where datalength(MspSrvLog_test.ClientIpNew) = 13
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = left(MspSrvLog_test.ClientIpNew, 12) + '0' + substring(MspSrvLog_test.ClientIpNew, 13, 100) from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key] where datalength(MspSrvLog_test.ClientIpNew) = 14

GO
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018781
Kstep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alexeyvg Не кажется ли Вам, что ваш код не только менее читаем и совсем не универсален т.к. адрес м.б. и 1.1.1.1 и 222.222.222.222, но и не решает проблемы с которой я столкнулся впринципе.
Спасибо всем за помощь, особенно Genady за очень ценные замечания. С проблемой разобрался.
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018801
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 KStep
Не нужно здесь никаких циклов, вот например код, безотносительно триггера просто каждый set в моем примере можете заменить на соответствующий апдэйт в вашем триггере, я просто хотел показать куда можно двигаться, вполне возможно мой код можно оптимизировать, пробуйте.
declare @vStr varchar(15)
declare @vInt int
set @vInt = 0
set @vStr = '12.01.23.98'
--print @vStr
print charindex('.', @vStr)
set @vStr = case (charindex('.', @vStr)) when 3 then '0' + @vStr
when 2 then '00' + @vStr end
print @vStr
print charindex('.', @vStr, 5)
set @vStr = case (charindex('.', @vStr, 5)) when 7 then stuff(@vStr, 4, 1, '0')
when 6 then stuff(@vStr, 4, 1, '00')end
print @vStr
print charindex('.', @vStr, 8 )
set @vStr = case (charindex('.', @vStr, 8 )) when 10 then stuff(@vStr, 7, 1, '0')
when 9 then stuff(@vStr, 7, 1, '00')end
print @vStr
print charindex('.', @vStr, 8 )
set @vStr = case 13 - len(@vStr) when 1 then stuff(@vStr, 10, 1, '0')
when 2 then stuff(@vStr, 10, 1, '00')end
print @vStr
print charindex('.', @vStr, @vInt)
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018803
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я не знаком с вашей задачей, но вполне вероятно реализовал бы предложение, которое сделал Garya
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32018805
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не читаем - согласен. Но вполне универсален - строки вида ххх.ххх.ххх.ххх, где символы ххх-1, 2 или 3 символа в любой из четырёх позиций дополняет нулями слева. Т.е
1.22.333.7 -> 001.022.333.007 и т.д. во всех обновляемых строках.

Осталось убрать точки (забыл):
update MspSrvLog_test
set MspSrvLog_test.ClientIpNew = replace(MspSrvLog_test.ClientIpNew,'.','')
from MspSrvLog_test join inserted on MspSrvLog_test.[key]= inserted.[key]
и получаем то, что требуется.

Конечно, этот метод неэффективен, т.к. приходится делать несколько упдэйтов. Но для милиони строк это будет в сотню раз быстрее, чем делать курсор и обрабатывать по строке.

Самый эффективный вариант - переделать мои упдейты на один с вложенными CASE, но мне лень писать - текст будет раз в 10 больше и действительно нечитаемым.

Могу предложить ещё вариант - в начале триггера проверяете @@rowcount - если 1 - то Ваш вариант, если > 1, то мой (если 0 - выход - не забудьте, что триггер сработает, даже если записи не обновились).
...
Рейтинг: 0 / 0
Триггер срабатывает только на первый Insert
    #32019269
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для того, чтобы триггер отрабатывал все добавляемые, обновляемые или удаляемые строки просто работайте с курсором, объявленным для таблиц, соответственно inserted и deleted
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер срабатывает только на первый Insert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]