GD PLACE
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) (→gd_place) |
||
| (не показаны 3 промежуточные версии 1 участника) | |||
| Строка 1: | Строка 1: | ||
| − | === | + | Иерархический справочник административно-территориальных единиц. |
| + | |||
| + | === gd_place === | ||
{| border="1" cellpadding="2" cellspacing="0" style="border-collapse:collapse;" | {| border="1" cellpadding="2" cellspacing="0" style="border-collapse:collapse;" | ||
| Строка 12: | Строка 14: | ||
|parent | |parent | ||
|[[dforeignkey]] | |[[dforeignkey]] | ||
| − | |[[Внешняя ссылка]] на | + | |[[Внешняя ссылка]] на вышележащий уровень. Например, область входит в страну, район в область, населенный пункт в район и т.д. |
|- valign="top" | |- valign="top" | ||
|lb | |lb | ||
| Строка 24: | Строка 26: | ||
|name | |name | ||
|[[dname]] | |[[dname]] | ||
| − | |Наименование | + | |Наименование административно-территориальной единицы. |
|- valign="top" | |- valign="top" | ||
| − | | | + | |placetype |
| − | |[[ | + | |[[dplacetype]] |
| − | | | + | |Тип административно-территориальной единицы. Строка. Например: Страна, Область, Район, Город и т.п. |
|- valign="top" | |- valign="top" | ||
| − | | | + | |telprefix |
| − | |[[ | + | |[[dtext8]] |
| − | | | + | |Телефонный код. |
|- valign="top" | |- valign="top" | ||
| − | | | + | |code |
| − | |[[ | + | |[[dtext8]] |
| − | | | + | |Числовой код административно-территориальной единицы. |
|- valign="top" | |- valign="top" | ||
| − | | | + | |editiondate |
| − | |[[ | + | |[[deditiondate]] |
| − | | | + | |Дата и время последнего исправления. |
|} | |} | ||
| + | |||
| + | === Проверка уникальности имени === | ||
| + | |||
| + | Два триггера гарантируют уникальность имени административно-территориальной единицы на одном уровне. | ||
| + | |||
| + | <pre> | ||
| + | |||
| + | CREATE EXCEPTION gd_e_placeexists 'Place already exists'; | ||
| + | |||
| + | SET TERM ^ ; | ||
| + | |||
| + | CREATE TRIGGER gd_bi_place FOR gd_place | ||
| + | BEFORE INSERT | ||
| + | POSITION 0 | ||
| + | AS | ||
| + | BEGIN | ||
| + | IF (NEW.ID IS NULL) THEN | ||
| + | NEW.ID = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0); | ||
| + | |||
| + | IF (EXISTS(SELECT * FROM gd_place WHERE COALESCE(parent, 0) = COALESCE(NEW.parent, 0) | ||
| + | AND UPPER(name) = UPPER(NEW.name))) THEN | ||
| + | BEGIN | ||
| + | EXCEPTION gd_e_placeexists; | ||
| + | END | ||
| + | END | ||
| + | ^ | ||
| + | |||
| + | CREATE TRIGGER gd_bu_place FOR gd_place | ||
| + | BEFORE UPDATE | ||
| + | POSITION 0 | ||
| + | AS | ||
| + | BEGIN | ||
| + | IF (EXISTS(SELECT * FROM gd_place WHERE COALESCE(parent, 0) = COALESCE(NEW.parent, 0) | ||
| + | AND UPPER(name) = UPPER(NEW.name) | ||
| + | AND ID <> NEW.id)) THEN | ||
| + | BEGIN | ||
| + | EXCEPTION gd_e_placeexists; | ||
| + | END | ||
| + | END | ||
| + | ^ | ||
| + | |||
| + | SET TERM ; ^ | ||
| + | |||
| + | </pre> | ||
| + | |||
| + | [[Category:База данных]] | ||
Текущая версия на 16:27, 8 июня 2013
Иерархический справочник административно-территориальных единиц.
[править] gd_place
| Имя поля | Тип данных | Описание |
|---|---|---|
| id | dintkey | Первичный ключ. |
| parent | dforeignkey | Внешняя ссылка на вышележащий уровень. Например, область входит в страну, район в область, населенный пункт в район и т.д. |
| lb | dlb | Левая граница интервала. |
| rb | drb | Правая граница интервала. |
| name | dname | Наименование административно-территориальной единицы. |
| placetype | dplacetype | Тип административно-территориальной единицы. Строка. Например: Страна, Область, Район, Город и т.п. |
| telprefix | dtext8 | Телефонный код. |
| code | dtext8 | Числовой код административно-территориальной единицы. |
| editiondate | deditiondate | Дата и время последнего исправления. |
[править] Проверка уникальности имени
Два триггера гарантируют уникальность имени административно-территориальной единицы на одном уровне.
CREATE EXCEPTION gd_e_placeexists 'Place already exists';
SET TERM ^ ;
CREATE TRIGGER gd_bi_place FOR gd_place
BEFORE INSERT
POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0);
IF (EXISTS(SELECT * FROM gd_place WHERE COALESCE(parent, 0) = COALESCE(NEW.parent, 0)
AND UPPER(name) = UPPER(NEW.name))) THEN
BEGIN
EXCEPTION gd_e_placeexists;
END
END
^
CREATE TRIGGER gd_bu_place FOR gd_place
BEFORE UPDATE
POSITION 0
AS
BEGIN
IF (EXISTS(SELECT * FROM gd_place WHERE COALESCE(parent, 0) = COALESCE(NEW.parent, 0)
AND UPPER(name) = UPPER(NEW.name)
AND ID <> NEW.id)) THEN
BEGIN
EXCEPTION gd_e_placeexists;
END
END
^
SET TERM ; ^