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

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

2 KStep
Я просто уверен, что при написании триггера, Вы не учли того момента, что триггер срабатывает один раз, вставляете Вы 1 запись, или 100000.
...
Рейтинг: 0 / 0
10.12.2001, 14:58
    #32018711
Kstep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
2 alexeyvg
Шутка удалась Гуру говоришь...
...
Рейтинг: 0 / 0
10.12.2001, 15:21
    #32018716
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
2 Kstep
Ну дык, нашел ошибку то?
Если нет, давайте код
...
Рейтинг: 0 / 0
10.12.2001, 15:37
    #32018721
Kstep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
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
10.12.2001, 15:46
    #32018723
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
-- по-моему проблема в этом Select'е
select @IpChar=inserted.ClientIp, @IpKey=inserted.[key]
from MspSrvLog_test, inserted
where MspSrvLog_test.[key]= inserted.[key]

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

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

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
11.12.2001, 08:13
    #32018781
Kstep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
2 alexeyvg Не кажется ли Вам, что ваш код не только менее читаем и совсем не универсален т.к. адрес м.б. и 1.1.1.1 и 222.222.222.222, но и не решает проблемы с которой я столкнулся впринципе.
Спасибо всем за помощь, особенно Genady за очень ценные замечания. С проблемой разобрался.
...
Рейтинг: 0 / 0
11.12.2001, 10:03
    #32018801
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
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
11.12.2001, 10:06
    #32018803
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
Кстати, я не знаком с вашей задачей, но вполне вероятно реализовал бы предложение, которое сделал Garya
...
Рейтинг: 0 / 0
11.12.2001, 10:09
    #32018805
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
Не читаем - согласен. Но вполне универсален - строки вида ххх.ххх.ххх.ххх, где символы ххх-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
19.12.2001, 06:46
    #32019269
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер срабатывает только на первый Insert
для того, чтобы триггер отрабатывал все добавляемые, обновляемые или удаляемые строки просто работайте с курсором, объявленным для таблиц, соответственно inserted и deleted
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер срабатывает только на первый Insert / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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