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

Откуда: Дубна
Сообщений: 295
Есть таблица с полями
country
region
city
street
house

Надо сделать проверку на сервере, чтобы исключить ввод подобных записей:
ул. Векслера - улица Векслера
г. Москва- город Москва. и т.д.
Т.е. их надо урезать до Векслера, Москва. Все

Может у кого-то есть подобное готовое решение или толковый совет?
Проверку на клиенте сделать нельзя.

На данный момент есть это. Таблички само собой создам отдельно. Пока здесь чтобы было понятно что происходит.
+
USE [isau]
GO
/****** Object: Trigger [dbo].[add_adress] Script Date: 05/17/2011 14:55:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[add_adress]
ON [dbo].[s_konf]
FOR INSERT
AS

declare @country varchar(150);
declare @region varchar(150);
declare @city varchar(150);
declare @street varchar(150);
declare @house varchar(150);

BEGIN
SET NOCOUNT ON;

declare @cities as table(id int identity(1,1), s varchar(32))
declare @streets as table(id int identity(1,1), s varchar(32))
declare @houses as table(id int identity(1,1), s varchar(32))

declare @str as varchar(128)

select
@city = city,
@street = street,
@house = house
from inserted

insert into @cities(s) values('город. ')
insert into @cities(s) values('город.')
insert into @cities(s) values('город ')
insert into @cities(s) values('город')
insert into @cities(s) values('гор. ')
insert into @cities(s) values('гор.')
insert into @cities(s) values('гор ')
insert into @cities(s) values('гор')
insert into @cities(s) values('г. ')
insert into @cities(s) values('г.')
insert into @cities(s) values('г ')
insert into @cities(s) values('г')

insert into @streets(s) values('улица. ')
insert into @streets(s) values('улица.')
insert into @streets(s) values('улица ')
insert into @streets(s) values('улица')
insert into @streets(s) values('ул. ')
insert into @streets(s) values('ул.')
insert into @streets(s) values('ул ')
insert into @streets(s) values('ул')
insert into @streets(s) values('у. ')
insert into @streets(s) values('у.')
insert into @streets(s) values('у ')
insert into @streets(s) values('у')

insert into @houses(s) values('дом. ')
insert into @houses(s) values('дом.')
insert into @houses(s) values('дом ')
insert into @houses(s) values('дом')
insert into @houses(s) values('д. ')
insert into @houses(s) values('д.')
insert into @houses(s) values('д ')
insert into @houses(s) values('д')

select @city = replace(@city, s, '') from @cities
order by s desc
select ltrim(rtrim(@city))

select @street = replace(@street, s, '') from @streets
order by s desc
select ltrim(rtrim(@street))

select @house = replace(@house, s, '') from @houses
order by s desc
select ltrim(rtrim(@house))

update s_konf
set city = @city,
street = @street,
house = @house
where id_konf = (select MAX(id_konf) from inserted)



END
17 май 11, 16:26    [10665964]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Алексей Ку.,

Ваш триггер никуда не годится - более одной записи вообще не ожидает.
Задача проверки, Вами описанной, не имеет приемлемого решения. IMHO
17 май 11, 16:31    [10666000]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Алексей Ку.,

сразу легонько пну вас не со зла =)
1) опять триггер который "думает" что всегда будет добавляться только одна запись
2) может быть лучше не after insert, а instead of?
3) нужны ли в таблице замен строки с терминальным пробелом?
17 май 11, 16:34    [10666027]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
SomewhereSomehow,

Терминальный пробел и вправду не нужен. Это осталось ещё с момента, когда ltrim rtrim не были прикручены. Спс.

2ALL

Клиент организован так, что вводится только одно значение.
17 май 11, 16:36    [10666038]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Алексей Ку.
Надо сделать проверку на сервере, чтобы исключить ввод подобных записей:
ул. Векслера - улица Векслера
г. Москва- город Москва. и т.д.
Т.е. их надо урезать до Векслера, Москва. Все

Может у кого-то есть подобное готовое решение или толковый совет?
Проверку на клиенте сделать нельзя.

На данный момент есть это.
Нужно фразы бить на слова по разделителям, и анализировать уже эти слова.
А то вы просто убираете все буквы "у" и "д" :-)

Ещё нужно поправить триггер, что бы он работал с набором записей. Или вставить проверку и откат при попытке вставить много записей

А так идея правильная, по другому никак.
17 май 11, 16:36    [10666040]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Алексей Ку.
Клиент организован так, что вводится только одно значение.
Это сегодня. А завтра начнете откуда-нибудь заливать. Раз уж вы написали обработку для одной записи за раз, надо в триггер вставить проверку, что записей пришло не более одной.
17 май 11, 16:37    [10666053]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Алексей Ку.
Клиент организован так, что вводится только одно значение.
Ну так чекайте это в триггере - всего одна строка, зато какая уверенность в завтрашнем дне!

ЗЫ. Хотя правильный код будет ни на строчку длиннее или сложнее неправильного. Видимо, просто привычка :-)
17 май 11, 16:39    [10666067]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Ку.
Надо сделать проверку на сервере, чтобы исключить ввод подобных записей:
ул. Векслера - улица Векслера
г. Москва- город Москва. и т.д.
Т.е. их надо урезать до Векслера, Москва. Все

Может у кого-то есть подобное готовое решение или толковый совет?
Проверку на клиенте сделать нельзя.

по предложеной таблице замен "г. грозный" превратится в "розный"
17 май 11, 16:41    [10666086]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexeyvg
А так идея правильная, по другому никак.
Какая идея?
Разве есть мало-мальски формализованный формат наименования объектов, которого строго придерживаются?
А как же посёлки, деревни, проспекты, шоссе, переулки, проезды, тупики, набережные, площади, кварталы,
строения, корпуса, владения и чёрт знает что ещё? И для всего ещё по нескольку вариантов сокращений.
Кстати, и буквы могут быть русскими, английскими со схожим написанием, смесью того и другого.
17 май 11, 16:47    [10666144]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Алексей Ку.
Клиент организован так, что вводится только одно значение.
в таком случае, сделайте ваш код немного более самодокументируемым, добавьте обработку случая когда запись не одна и желательно снабдив самобичующим комментарием, который уверит других программистов, которые может-быть-когда-нибудь будут смотреть ваш код, в том что вы так сделали не по незнанию, а просто потому что лень =)
alexeyvg,
кстати да, на логику я и не посмотрел, действительно, может получиться забавно, славный город "Дубна", превратится в лаконичное "бна"! =)

Алексей Ку.,
по поводу разбора на слова, есть много тем в поиске, в частности только седня в соседней ветке опять это мучали.
17 май 11, 16:47    [10666148]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Glory
по предложеной таблице замен "г. грозный" превратится в "розный"
Ага, а "Удомля" вообще в краткое "ля" :-)
17 май 11, 16:49    [10666157]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
iap
alexeyvg
А так идея правильная, по другому никак.
Какая идея?
Разве есть мало-мальски формализованный формат наименования объектов, которого строго придерживаются?
Не, конечно, согласен, это неправильно.

Просто в предложенной постановке задачи (типа клиента править нельзя. ошибки выдавать нельзя), это единственный выход.

Хотя лучьше делать правильного клиента или хотя бы выдавать ошибки и откатывать транзакцию.

И вообще схема данных тут кривая, не учитывает реальную структуру адресов.
iap
А как же посёлки, деревни, проспекты, шоссе, переулки, проезды, тупики, набережные, площади, кварталы,
строения, корпуса, владения и чёрт знает что ещё? И для всего ещё по нескольку вариантов сокращений.
Кстати, и буквы могут быть русскими, английскими со схожим написанием, смесью того и другого.
Это конечно нужно дорабатывать, добавлять сокращения. Все английские буквы удалить.
17 май 11, 16:53    [10666201]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Клиент пользуется маленьким числом людей. База организована так, что именно только такие поля и буду, т.е. города, улицы и дома. Без переулков и т.д. Как бы в неё будут вносится адреса, по которым проходили конференции всякие. Вряд ли конференции проводят в переулках, тупиках и т.д.

Надеюсь клиенту не припрёт в голову придумает сокращение для страны, типа стр. Россия.

К тому же после некоторого времени работы системы, таблица будет просмотрена и добавлены ещё проверки в триггер.

+Допишу, чтобы клиенту кидалось сообщение, если триггер срабатывает со смыслом "просьба вносить адреса след образом...". Клиент принимает такие сообщения.

Ну а пока вот окончательный вариант

+
CREATE TABLE [dbo].[trim_cities](id int identity(1,1), s varchar(32))
CREATE TABLE [dbo].[trim_streets](id int identity(1,1), s varchar(32))
CREATE TABLE [dbo].[trim_houses](id int identity(1,1), s varchar(32))

insert into trim_cities(s) values('город.')
insert into trim_cities(s) values('город')
insert into trim_cities(s) values('гор.')
insert into trim_cities(s) values('гор')
insert into trim_cities(s) values('г.')
insert into trim_cities(s) values('г ')

insert into trim_streets(s) values('улица.')
insert into trim_streets(s) values('улица')
insert into trim_streets(s) values('ул.')
insert into trim_streets(s) values('ул')
insert into trim_streets(s) values('у.')
insert into trim_streets(s) values('у ')

insert into trim_houses(s) values('дом.')
insert into trim_houses(s) values('дом')
insert into trim_houses(s) values('д.')
insert into trim_houses(s) values('д ')

ALTER TRIGGER [dbo].[add_adress]
ON [dbo].[s_konf]
INSTEAD OF INSERT
AS


declare @city varchar(150);
declare @street varchar(150);
declare @house varchar(150);

BEGIN
SET NOCOUNT ON;
select
@city = city,
@street = street,
@house = house
from inserted

update s_konf
set city = rtrim(ltrim((select replace(@city, s, '') from trim_cities))),
street = rtrim(ltrim((select replace(@street, s, '') from trim_streets))),
house = rtrim(ltrim((select replace(@house, s, '') from trim_houses)))
from s_konf, inserted
where s_konf.id_konf = inserted.id_konf


END
17 май 11, 16:59    [10666247]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
[quot SomewhereSomehow]
Алексей Ку.
...
кстати да, на логику я и не посмотрел, действительно, может получиться забавно, славный город "Дубна", превратится в лаконичное "бна"! =)


Собственно оттуда и являюсь :). ПОтому вернул терминальные пробелы для одной буквы.
17 май 11, 17:02    [10666281]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
iljy
Member

Откуда:
Сообщений: 8711
Алексей Ку.
Вряд ли конференции проводят в переулках, тупиках и т.д.

Гы Блаженны верующие. Коференции часто проходят в каких-нибудь бизнеспарках, где адрес может включать такие части, как владение и строение, или вообще в каких-нибудь пансионатах с адресом Московская область, Звенигородский район, 40км Новорижского шоссе
17 май 11, 17:06    [10666313]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Алексей Ку.
Клиент пользуется маленьким числом людей. База организована так, что именно только такие поля и буду, т.е. города, улицы и дома. Без переулков и т.д. Как бы в неё будут вносится адреса, по которым проходили конференции всякие. Вряд ли конференции проводят в переулках, тупиках и т.д.
Зато конференции проводятся на проспектах, шоссе и бульварах.

Хотя конференции часто проводятся в центре, а там переулков, площадей и тупиков...

Алексей Ку.
Ну а пока вот окончательный вариант
INSTEAD OF INSERT предполагает, что вы сами вставляете записи, вместо сервера. Т.е. в конце нужно не UPDATE, а INSERT

Ещё добавьте варианты слов с концевыми пробелами.

Ну и проверочку не забудьте на много записей.
17 май 11, 17:11    [10666369]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
если уж городить - берите КЛАДР, заливайте к себе в базу, там всё это безобразие есть :)
и на мой взгляд, такие штуки проще на клиенте проверять
17 май 11, 17:49    [10666792]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверки ввода адреса  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Нельзя на клиенте :(...

В итоге триггер не нужен и набор полей вообще другой. Заказчик мудаг и полный имбицил... И это мягко сказано. В который раз убедился что ТЗ надо составлять СУПЕР подробно, до последнего поля и т.д. И после заказчику башку до дыр протереть, пока он так же подробно не просмотрел ТЗ. Делайте выводы, кто с таким не сталкивался...
17 май 11, 18:01    [10666925]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить