Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Знающие люди, помогите пожалуста!!! Триггер на Insert срабатывает только на первую запись, а последующие игнорирует, т.е. если задать для внесения данных в таблицу insert into (...) select top 1 (..) from (..) все классно, но если insert into (...) select top 2 (..) from (..) , то он обрабатывае только первую запись, а следующие пропускает. Что не так???? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 14:24 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Вам повезло! У меня триггер обрабатывает только 5-ю запись: create trigger MyTrigger on MyTable for insert as UPADTE MyTable2 SET fld=1 WHERE ID = 5 GO Представляете??? Мелкософт!!! М$!!! Присылайте текст триггера, будем в форуме разбираться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 14:33 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
2 alexeyvg Да ладно Вам, человек просто новичек,я свой первый триггер тоже написал для обработки одной записи FoxPro понимаете жив 2 KStep Я просто уверен, что при написании триггера, Вы не учли того момента, что триггер срабатывает один раз, вставляете Вы 1 запись, или 100000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 14:37 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
2 alexeyvg Шутка удалась Гуру говоришь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 14:58 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 15:21 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 15:37 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
-- по-моему проблема в этом Select'е select @IpChar=inserted.ClientIp, @IpKey=inserted.[key] from MspSrvLog_test, inserted where MspSrvLog_test.[key]= inserted.[key] Да проблема в нем, в переменную нельзя вставить массив значений, на то она и переменная. Исходя из вашего кода, мне кажется нужно переписать весь триггер, подозреваю, что можно обойтись без цикла, опишите подробнее что должен делать триггер. P.S. Попробуйте отойти от мышления построчной обработки строк, SQL оперирует не строками, а наборами строк, частные случаи которых могут быть пустой набор или набор состоящий из одной строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 15:46 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Задача в том чтобы преобразовать ip адреса, который пишет в базу MsProxy в вид в котором их можно было бы сортировать и задавать в запросе промежуток адресов. Т.е. перевести 112.78.66.1 в 112078066001. Первое что пришло в голову триггер на insert. База может быть несколько гигов так что желательно преобразовывать на лету(т.е. в момент записи). А цыкл нужен для преобразования IP из одного вида в другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 15:55 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Не мешало бы уточнить версию SQL-сервера. Твоя задача наиболее изящно решается на SQL2000 с помощью instead-триггера. А вообще лично я бы сделал наоборот. В таблице хранил бы четыре раздельных поля (каждое типа tinyint), а через VIEW объединял бы их в одно (если в этом действительно есть необходимость, в чем я очень сомневаюсь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 16:51 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Вот кстати и статья по этому поводу Хранение и сортировка адресов IP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 16:59 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Ещё можно переписать триггер без цикла: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2001, 17:05 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
2 alexeyvg Не кажется ли Вам, что ваш код не только менее читаем и совсем не универсален т.к. адрес м.б. и 1.1.1.1 и 222.222.222.222, но и не решает проблемы с которой я столкнулся впринципе. Спасибо всем за помощь, особенно Genady за очень ценные замечания. С проблемой разобрался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2001, 08:13 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2001, 10:03 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Кстати, я не знаком с вашей задачей, но вполне вероятно реализовал бы предложение, которое сделал Garya ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2001, 10:06 |
|
||
|
Триггер срабатывает только на первый Insert
|
|||
|---|---|---|---|
|
#18+
Не читаем - согласен. Но вполне универсален - строки вида ххх.ххх.ххх.ххх, где символы ххх-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 - выход - не забудьте, что триггер сработает, даже если записи не обновились). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2001, 10:09 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3521&tid=1824565]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 387ms |

| 0 / 0 |
