![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обеспечить невозможность вставки данных в обратном порядке
Игорь Шевченко © (2007-09-28 11:59:00)Имеется таблица из двух полей (город1, город2)
Требуется обеспечить отсутствие записей с обратным порядком тех же самых городов, если есть запись "Москва","Бобруйск", то запись "Бобруйск","Москва" должно невозможно добавить любым способом.
Вопрос собственно, можно ли объявить такое ограничение на уровне объявления таблицы ?
evvcom (2007-10-01 09:02:00) [1]
> Petr V. Abramov © (28.09.07 22:48) [30]
Ты имеешь ввиду оракловую консерваторию? Дык, на то он и конкретный сервер со своими примочками, чтобы не ограничиваться только стандартами.
Petr V. Abramov (2007-09-28 22:48:00) [2]> Игорь Шевченко ©
в пределах консерватории решение красивое :)))
Игорь Шевченко (2007-09-28 16:25:00) [3]Anatoly Podgoretsky © (28.09.07 16:04) [23]
Да, конечно на уровне сервера. Уникальным индексом по функции я вроде добился нужного.
Павел Калугин (2007-09-28 16:22:00) [4]> [27] evvcom © (28.09.07 16:19)
увы мне увы....
evvcom (2007-09-28 16:19:00) [5]
> Павел Калугин © (28.09.07 16:07) [25]
В чистом виде это на Оракл не перевести, а с минимальной корректировкой можно, но такое Оракл зарубит сразу. У него другие принципы, отличные от MSSQL.
sniknik (2007-09-28 16:14:00) [6]Павел Калугин © (28.09.07 16:07) [25]
решение в [6] и проше. и, имхо, менее "напряжно" для сервера. (чтобы точно, это надо проверить)
Павел Калугин (2007-09-28 16:07:00) [7]Ну если на входе код города, да еще и цифровой и код города 2, то решил бы уникальным индексом по полям city1, city2
и на insert поставил триггер
в котором
if exists(select 1
from foo f,inserted i
where f.city1 = i.city2
and f.city2 = i.city1
)
begin
raiseerror('Существует такая комбинация городов')
rollback
return
end
Опять же прошу прощения что не в оракловом синтаксисе
sniknik (2007-09-28 16:05:00) [8]> про MSSql или про Sybase то написал бы кроме upper ещё ltrim rtrim
а я бы и upper убрал бы... это дело коллатионов сравнение/индексирование разноразрядных букв (коллатион естественно бы поставил CASE IGNORE)
Anatoly Podgoretsky (2007-09-28 16:04:00) [9]> Игорь Шевченко (28.09.2007 15:58:21) [21]
Насколько я понимают тебе надо решение на уровне сервера.
На клиенте хоть и просто, но ненадежно.
Игорь Шевченко (2007-09-28 15:58:00) [10]Павел Калугин © (28.09.07 15:54) [20]
Пробелы не допускаются.
Игорь Шевченко (2007-09-28 15:58:00) [11]Павел Калугин © (28.09.07 15:49) [19]
Ввод осуществляется INSERT-ом :)
Города вводятся кодами, разумеется. И выбором и набором текста.
Павел Калугин (2007-09-28 15:54:00) [12]И если бы речь шла про MSSql или про Sybase то написал бы кроме upper ещё ltrim rtrim
то есть ltrim(rtrim(UPPER(city1))) и так далее
Ибо если вводит операторто никто не застрахован от
INSERT INTO FOO VALUES ('Москва','Бобруйск');
INSERT INTO FOO VALUES ('Бобруйск',' Москва ');
Павел Калугин (2007-09-28 15:49:00) [13]разделитель между городами известен?
ввод осуществляется выбором из справочника или набором текста?
Desdechado (2007-09-28 15:31:00) [14]> ON DELETE CASCADE
> Смело!
Для кросс-таблицы вполне нормально, хотя и не всегда нужно.
sniknik (2007-09-28 14:53:00) [15]> Интересно MSSQL это поддерживает?
а че нет то? синтаксис записи конечно будет другой, а логику показанную в [6] почему и не повторить?
evvcom (2007-09-28 14:27:00) [16]
> Это бизнес-правило такое.
Главное, чтобы оно было задокументировано. Чтобы потом было, чем отмахиваться при разборах "внезапного" исчезновения данных :)
Игорь Шевченко (2007-09-28 14:20:00) [17]Desdechado © (28.09.07 13:58) [13]
Пардон, не так выразился. Хотел сказать - на уровне объявлений :)
evvcom © (28.09.07 14:10) [14]
> Смело!
Это бизнес-правило такое.
evvcom (2007-09-28 14:10:00) [18]
> ON DELETE CASCADE
Смело!
Desdechado (2007-09-28 13:58:00) [19]> А что это, если не секрет ?
На уровне индекса :)
На уровне таблицы - это UNIQUE CONSTRAINT.
stanislav (2007-09-28 13:19:00) [20]Reindeer Moss Eater © (28.09.07 12:40) [8]
Понял.Интересно MSSQL это поддерживает?