|
|
| Строка 1: |
Строка 1: |
| | + | Здесь собраны все ссылки |
| | + | |
| | * [[MIS3. Концепция БД]] | | * [[MIS3. Концепция БД]] |
| | * [[MIS3. Интерфейс пользователя]] | | * [[MIS3. Интерфейс пользователя]] |
| | * [[MIS3. Разграничение доступа к функция системы]] | | * [[MIS3. Разграничение доступа к функция системы]] |
| | | | |
| − |
| + | [[Категория:MIS3]] |
| − | | |
| − | | |
| − | == Целостность ==
| |
| − | | |
| − | База сама должна поддерживать целостность данных – это возможно с помощью стандартных средств constraint и trigger.
| |
| − | | |
| − | Foreign Key на другие схемы допускается только в состоянии Disable. (подумать почему, и может быть сделать более жесткое требование).
| |
| − | | |
| − | TODO Нужен скрипт который помогает найти недостающие FK. смотри на SVN "ER\DOC\DB\SCRIPTS\Columns - Кандидаты на FK.SQL"
| |
| − | | |
| − | == Самодокументирование ==
| |
| − | | |
| − | Количество комментариев, Foregn Key должно и правил именования должно быть достаточным для понимания БД. Поэтому предъявляются следующие требования
| |
| − |
| |
| − | {| width="100%" border="1" cellpadding="0" cellspacing="0"
| |
| − | |-
| |
| − | | Таблица
| |
| − |
| |
| − | | Все таблицы и столбцы должны иметь комментарий. Для таблицы в комментарии обязательно должно быть написано кто автор таблицы Строка Author
| |
| − | |-
| |
| − | | Комментарий к столбцам
| |
| − |
| |
| − | | Все столбцы должны иметь комментарий. Первичный ключ использующий sequence должен содержать комментарий вида «SEQUENCE=[SEQUNECE_NAME]». Такой комментарий позволит вчислить зависимости столбцов от последовательностей. <br>
| |
| − | |-
| |
| − | | Комментарии к коду<br>
| |
| − |
| |
| − | | За основу берем формат комментариев из PLSQLDeveloper. Инструкция находится рядом с этим документом<br>
| |
| − | |}
| |
| − | | |
| − | TODO Также ye;ys скрипты для проверки достаточности комментариев на основе MIS2:
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Column - Правит комментарии к ID.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Column - Столбцы без комментария.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Columns - Неправильные комментарии к ID.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Table - Неправильные комментарии к таблицам.sql"
| |
| − | | |
| − | == Соглашение об именовании ==
| |
| − | | |
| − | Таблицы, процедуры, пакеты именуются без префиксов в единственном числе на английском языке. Для вторичных объектов - последовательностей, ключей, индексов и так далее - должны быть определены четкие правила, выводящие их имя из имени основного объекта. Какие именно - не суть; главное, нужен однозначный алгоритм. Большим минусом здесь является ограничение длины идентификаторов.
| |
| − |
| |
| − | | |
| − | === 1. Таблицы ===
| |
| − | | |
| − | | |
| − | 1.1. Таблицы именуются существительными в ед. числе на английском языке. (Рассматривать как название сущности). Не использовать в именовании этих объектов символ «$»
| |
| − | | |
| − | 1.2. Все таблицы и столбцы должны иметь комментарий. Для таблицы в комментарии обязательно должно быть написано кто автор таблицы. (После строчки “Author:” ). Если автор у таблицы изменился, то старого автора оставлять.
| |
| − | | |
| − | 1.3. Каждая таблица должна иметь первичный ключ, типа INTEGER (название ID).
| |
| − | | |
| − | 1.4. Первичные ключи делаем через bigserial
| |
| − | | |
| − | 1.5. Если поле заполняется из SEQUENCE, то в комментарий должен содержать имя sequence по следующему шаблону '''SEQUENCE=[%SEQUENCE_NAME%]'''
| |
| − | | |
| − | 1.6. Столбцы, ссылающиеся на другую таблицы именовать по правилу: '''%TABLE%_ID'''
| |
| − | | |
| − | 1.7. Таблицы содержащие исторические данные '''%TABLE%_H'''
| |
| − | | |
| − | 1.8. Временные таблицы '''%TABLE%_TMP'''
| |
| − | | |
| − | 1.9. Таблицы созданные для каких либо тестов TEST_%TABLE%
| |
| − | | |
| − | 1.10. Таблицы копии %TABLE%_YYMMDD
| |
| − | | |
| − | | |
| − | === 2. Индексы ===
| |
| − | | |
| − | 2.1. Индексы неуникальные (NORMAL) именуются по правилу '''IX_%TABLE%$%FIELDS%'''. Если название не помещается в 30 символов, то сокращать названия полей.
| |
| − | | |
| − | 2.2. Индексы уникальные (NORMAL) именовать по правилу '''IU_%TABLE%$%FIELDS%'''. Если название не помещается в 30 символов, то сокращать названия полей.
| |
| − | | |
| − | 2.3. Индексы функциональные (FUNCTION-BASED NORMAL) именовать по правилу '''IF_%TABLE%$%FUNC%'''.
| |
| − | | |
| − | 2.4. Индексы первичного ключа именуются так же как и сам првичный ключ '''PK_%TABLE%$%'''
| |
| − | | |
| − | | |
| − | === 3. Констаринты ===
| |
| − | | |
| − | 3.1. Ссылки (References) именуем по правилу '''FK_%TABLE%$% REFTABLE%.''' Если название не помещается в 30 символов, то сокращать названия полей. Если есть две ссылки на одну таблицу, то именовать по правилу '''FK_%TABLE%$% REFTABLE%REFFIELD'''.
| |
| − | | |
| − | 3.2. Not Null. Необязательное правило '''NN_%TABLE%$%FIELD%'''. Есть скрипт который все переименовывает.
| |
| − | | |
| − | 3.3. Первичный ключ именуются по правилу '''PK_%TABLE%'''
| |
| − | | |
| − | | |
| − | === 4. Триггеры ===
| |
| − | | |
| − | 4.1. Именуются по правилу '''%TABLE%$%Суффикс%'''. Где суффикс определяет тип триггера и может иметь длину от 2 до 5 символов.
| |
| − | * Первая буква определяет момент срабатывания триггера (Timing) и может имеет значение A или B (After, Before)
| |
| − | * ДалееObject Event - комбинация букв I,U,D
| |
| − | * Если триггер уровня оператора, то прибавляем в конце S
| |
| − | | |
| − | | |
| − | === 5. Другие объекты ===
| |
| − | | |
| − | 5.1. SEQUENCE должны иметь суффикс SEQ. Правило выглядит так %TABLE%_%COLUMN%_SEQ.
| |
| − | | |
| − | 5.2. Views : <name>_V
| |
| − | | |
| − | 5.3. Materialized Views: <name>_MV
| |
| − | | |
| − | 5.4. Types : <name>_T
| |
| − | | |
| − | 5.5. Directories : <name>_DIR
| |
| − | | |
| − | 5.6. External Tables : <name>_EXT
| |
| − | | |
| − | === 6. PL/SQL Variables ===
| |
| − | | |
| − | 6.1. Package Global Variables: g_variable_name
| |
| − | | |
| − | 6.2. Local Variables : l_variable_name
| |
| − | | |
| − | 6.3. Types : t_type_name
| |
| − | | |
| − | 6.4. Cursors : c_cursor_name
| |
| − | | |
| − | 6.5. Exceptions : e_exception_name
| |
| − | | |
| − | 6.6. Input Parameters : i_parameter_name
| |
| − | | |
| − | 6.7. Outut Parameters : o_parameter_name
| |
| − | | |
| − | 6.8. In/Out Parameters : io_parameter_name
| |
| − | | |
| − | | |
| − | === 7. Процедуры, функции, пакеты ===
| |
| − | | |
| − | 7.1. При объявлении переменных в заголовке обязателен префикс p_. Это избавит от неоднозначности при компиляции
| |
| − |
| |
| − | | |
| − | 7.2. Переменные внутри PL/SQL блока должны иметь префикс v_. Это избавит от неоднозначности при компиляции
| |
| − |
| |
| − | | |
| − | 7.3. Процедуры изменяющие данные в таблицах, должны иметь префикс '''DO_'''
| |
| − |
| |
| − | | |
| − | 7.4. Функции, возвращающие значение должные иметь префикс '''GET_'''
| |
| − |
| |
| − | | |
| − | 7.5. Комментарии пишем в виде, plsqldoc (plugin for plsqlDeveloper). Основные Тэги:
| |
| − |
| |
| − | | |
| − | {| width="100%" border="1" cellpadding="0" cellspacing="0"
| |
| − | |-
| |
| − | ! scope="col" | Tag
| |
| − | ! scope="col" | Description
| |
| − | |-
| |
| − | | %param <name> <text><br>
| |
| − | | The description of a function or procedure parameter. Subsequent %param tags will be placed in one table.<br>
| |
| − | |-
| |
| − | | %return <text><br>
| |
| − | | A description of the return value of a function.<br>
| |
| − | |-
| |
| − | | %value <name> <text><br>
| |
| − | | A possible value for a package variable or object type attribute. Subsequent %value tags will be placed in one table.<br>
| |
| − | |-
| |
| − | | %raises <name[.element]> <text><br>
| |
| − | | A list of exceptions that can be raised by a program unit. Subsequent %raises tags will be placed in one table.<br>
| |
| − | |-
| |
| − | | %usage <text><br>
| |
| − | | A text to describe the usage of the element.<br>
| |
| − | |-
| |
| − | | %author <name><br>
| |
| − | | The author of the object<br>
| |
| − | |-
| |
| − | | {%link <name[.element[;n]]> <br> [description]}<br>or<br>{%link <filename> [description]}<br><br>
| |
| − | | An explicit hyperlink. To link to a specific overloading of a program unit, follow the name by a semi-colon and the overload index (1-based). The optional description will be placed in the document. For example:<br>The {%link department.name department name function} is...<br>Will result in:<br>The department name function is…<br><br>
| |
| − | |-
| |
| − | | {*} <name> <text><br>
| |
| − | | A bullet of a bullet list. Useful to describe possible values of a parameter or return value. For example:<br>{*} 0 The function returned successfully<br>{*} 1 The employee does not exist<br>{*} 2 The employee record is locked<br><br>
| |
| − | |-
| |
| − | | {%skip}<br>
| |
| − | | Skip this comment block for documentation.<br>
| |
| − | |-
| |
| − | |}
| |
| − | | |
| − | <br>
| |
| − | Пример:
| |
| − | <source lang="sql">
| |
| − | create or replace package Department is
| |
| − | | |
| − | -- Package with functionality related to the Dept table.
| |
| − | -- Most functions require a p_DeptNo parameter, which
| |
| − | -- is the value of the DeptNo column in the {%link Dept}
| |
| − | -- table.
| |
| − | | |
| − | -- Value for p_Wait parameters, indicating to wait
| |
| − | -- until a lock is released.
| |
| − | c_Wait constant boolean := true;
| |
| − | -- Value for p_Wait parameters, indicating not to
| |
| − | -- wait until a lock is released.
| |
| − | c_NoWait constant boolean := false;
| |
| − | | |
| − | -- Exception raised when an invalid order is specified
| |
| − | e_InvalidOrder exception;
| |
| − | -- Exception raised when a record is locked
| |
| − | e_RecordLocked exception;
| |
| − |
| |
| − | -- A department record. It contains all columns of the
| |
| − | -- {%link Dept} table.
| |
| − | subtype t_DeptRecord is Dept%rowtype;
| |
| − |
| |
| − | -- A cursor type for parameters that return a set of
| |
| − | -- departments.
| |
| − | type t_DeptCursor is ref cursor return Dept%rowtype;
| |
| − | | |
| − | -- Open a cursor to select departments in a particular order.
| |
| − | -- %param p_cursor The cursor that will be opened for all
| |
| − | -- Dept records in the given order
| |
| − | -- %param p_order The order of the Dept records. Valid values are:
| |
| − | -- {*} 'DEPTNO' Records are ordered by DeptNo.
| |
| − | -- {*} 'NAME' Records are ordered by name.
| |
| − | -- {*} 'LOC' Records are ordered by loc. The secondary
| |
| − | -- sort column is DeptNo.
| |
| − | -- {*} NULL The result set will not be ordered
| |
| − | -- (default).
| |
| − | -- %raises e_InvalidOrder Raised when the value of p_order is invalid.
| |
| − | procedure SelectRecords(p_Cursor in out t_DeptCursor,
| |
| − | p_Order varchar2 default null);
| |
| − | | |
| − | -- Lock a Dept record.
| |
| − | -- %param p_DeptNo The number of the department record to lock.
| |
| − | -- %param p_Wait Wait for an existing lock to be released?
| |
| − | -- {*} c_Wait Wait until the record is available.
| |
| − | -- {*} c_NoWait Don't wait, and raise e_RecordLocked
| |
| − | -- if the record is locked.
| |
| − | -- %raises e_RecordLocked Raised when the record is locked and
| |
| − | -- p_Wait = c_Wait.
| |
| − | procedure LockRecord(p_DeptNo Dept.DeptNo%type,
| |
| − | p_Wait boolean default c_Wait);
| |
| − | | |
| − | -- Return the number of employees in the {%link Emp} table that
| |
| − | -- belong to this department.
| |
| − | -- %param p_DeptNo The number of the department.
| |
| − | -- %return The number of employees
| |
| − | function EmpCount(p_DeptNo Dept.DeptNo%type) return integer;
| |
| − | | |
| − | -- Return the employee number of the manager of the department.
| |
| − | -- %param p_DeptNo The number of the department.
| |
| − | -- %return The number of the employee (Emp.EmpNo) that manages
| |
| − | -- this department (Emp.job = 'MANAGER'). If the
| |
| − | -- department does not have a manager, NULL is returned.
| |
| − | function Manager(p_DeptNo Dept.DeptNo%type) return Emp.EmpNo%type;
| |
| − | | |
| − | end Department;
| |
| − | | |
| − | </source>
| |
| − | | |
| − | | |
| − | === 8. Объекты связанные с аудитом данных ===
| |
| − | | |
| − | 8.1. Таблицы, и индексы создаем в таблеспайсах LOG, LOG_INDX
| |
| − |
| |
| − | 8.2. Таблицы должны иметь суффикс %TABLE%_LOG
| |
| − | | |
| − | 8.3 с декабря 2012 появилась возможность ведения истории изменений по таблице см. [[PKG_GENERATE]]
| |
| − | | |
| − | === 9. Сводная таблица правил ===
| |
| − | | |
| − | === 10. Сокращения ===
| |
| − | | |
| − | Если при именовании подчиненных объектов (FK и прочее), выходим за ограничение длины, то использовать следующее правило:<br>
| |
| − | *APPLICATIONS = APPL (4)
| |
| − | *APPLICATION_FUNCTIONS = APFU (2:2)
| |
| − | *APPLICATON_FUNCTION_ROLES = APFR (2:1:1)
| |
| − | *APPLICATION_FUNCTION_ROLE_BANANAS = AFRB (1:1:1:1)
| |
| − | | |
| − | По возможности использовать стандартные сокращения при названии сущностей :
| |
| − |
| |
| − | {| width="550" border="1" cellpadding="0" cellspacing="0"
| |
| − | |+ Стандартные сокращения
| |
| − |
| |
| − |
| |
| − | |-
| |
| − | | Account
| |
| − |
| |
| − | | ACCNT
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Addres
| |
| − |
| |
| − | | ADDR
| |
| − |
| |
| − | | Адрес
| |
| − | |-
| |
| − | | Adjustment
| |
| − |
| |
| − | | ADJ
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Alternate
| |
| − |
| |
| − | | ALT
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Application
| |
| − |
| |
| − | | APP
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Attribute
| |
| − |
| |
| − | | ATTR
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Beginning
| |
| − |
| |
| − | | BEG
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Budget
| |
| − |
| |
| − | | BUDG
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Category
| |
| − |
| |
| − | | CATG
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | COUNT
| |
| − |
| |
| − | | CNT
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Difference
| |
| − |
| |
| − | | DIFF
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Column
| |
| − | | COL
| |
| − | |
| |
| − | |-
| |
| − | | Comment
| |
| − | | CMT
| |
| − | | Комментарий
| |
| − | |-
| |
| − | | Currency
| |
| − |
| |
| − | | CURR
| |
| − |
| |
| − | |
| |
| − | |-
| |
| − | | Customer
| |
| − | | CUST
| |
| − | | заказчик
| |
| − | |-
| |
| − | | DATE
| |
| − | | DT
| |
| − | | дата
| |
| − | |-
| |
| − | | DAY
| |
| − | | DY
| |
| − | | день
| |
| − | |-
| |
| − | | Department
| |
| − | | DEPT
| |
| − | | отдел, подразделение
| |
| − | |-
| |
| − | | Document
| |
| − | | DOC
| |
| − | | документ
| |
| − | |-
| |
| − | | Employee
| |
| − | | EMP
| |
| − | | работник
| |
| − | |-
| |
| − | | Error
| |
| − | | ERR
| |
| − | |
| |
| − | |-
| |
| − | | Identifier
| |
| − | | ID
| |
| − | |
| |
| − | |-
| |
| − | | Information
| |
| − | | INFO
| |
| − | | информация
| |
| − | |-
| |
| − | | Inventory
| |
| − | | INV
| |
| − | | Опись. Реестр, инвентарь
| |
| − | |-
| |
| − | | Location
| |
| − | | LOC
| |
| − | | местоположение
| |
| − | |-
| |
| − | | Length
| |
| − | | LNTH
| |
| − | | длина
| |
| − | |-
| |
| − | | Month
| |
| − | | MO
| |
| − | | месяц
| |
| − | |-
| |
| − | | Number
| |
| − | | NUM
| |
| − | | номер, количество
| |
| − | |-
| |
| − | | Organization
| |
| − | | ORG
| |
| − | | организация
| |
| − | |-
| |
| − | | Option
| |
| − | | OPT
| |
| − | |
| |
| − | |-
| |
| − | | Payment
| |
| − | | PAY
| |
| − | | платеж
| |
| − | |-
| |
| − | | Percent
| |
| − | | PCT
| |
| − | | процент
| |
| − | |-
| |
| − | | Previous
| |
| − | | PREV
| |
| − | | предыдущий
| |
| − | |-
| |
| − | | Record
| |
| − | | REC
| |
| − | | запись
| |
| − | |-
| |
| − | | Report
| |
| − | | RPT
| |
| − | | отчет
| |
| − | |-
| |
| − | | Required
| |
| − | | REQ
| |
| − | |
| |
| − | |-
| |
| − | | Section
| |
| − | | SECT
| |
| − | | секция
| |
| − | |-
| |
| − | | Status
| |
| − | | STS
| |
| − | | статус
| |
| − | |-
| |
| − | | Table
| |
| − | | TAB
| |
| − | | таблица
| |
| − | |-
| |
| − | | Temporary
| |
| − | | TEMP
| |
| − | | временный
| |
| − | |-
| |
| − | | Value
| |
| − | | VAL
| |
| − | | значение, переменная
| |
| − | |-
| |
| − | | Version
| |
| − | | VER
| |
| − | | версия
| |
| − | |-
| |
| − | | Year
| |
| − | | YR
| |
| − | | год
| |
| − | |}
| |
| − | | |
| − | См также скрипты для проверки правильности именования объектов:
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Constraint - Set RULE FK name.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Index - Set RULE Name.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTSIndex - Процент правильно именованных индексов.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\SEQUENCE - Неправильно названные.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Table -названия во множественном числе.sql"
| |
| − | * "MIS2\DOC\DB\SCRIPTS\Trigger - Создаем скрипт для правильного именования.sql"
| |
| − | | |
| − | == Безопасность ==
| |
| − | | |
| − | Авторизация пользователей осуществляется с помощью стандартных средств Oracle. При этом:
| |
| − | * скрывается истинный пароль и пользователя.
| |
| − | * Пользователь MIS имеет очень сложный пароль и под ним никто не должен логиниться.
| |
| − | * Логины Oracle формируются по правилу Z+<логин в системе МИС>
| |
| − | * Пользователь MISADMIN обладает правами DBA.
| |
| − | | |
| − | | |
| − | === Роли POSTGRESQL ===
| |
| − | {| width="90%" border="1" cellpadding="0" cellspacing="0"
| |
| − | |-
| |
| − | ! scope="col" | Роль
| |
| − | ! scope="col" | Назначение и права
| |
| − | |-
| |
| − | | MIS_ROLE
| |
| − | | Роль которой обладают все пользователи МИС. Дает необходимые права для работы в системе
| |
| − | |-
| |
| − | | DEVELOPER_ROLE
| |
| − | | Роль для девелоперов из медотрейд
| |
| − | |}
| |
| − | | |
| − | == Разделение схем ==
| |
| − | Все данные МИС должны храниться в схеме MIS. Данные аудита должны храниться в схеме MIS_LOG. Архивные данные в схеме MIS_HST.
| |
| − | | |
| − | {| width="90%" border="1" cellpadding="0" cellspacing="0"
| |
| − | |-
| |
| − | ! scope="col" | Схема
| |
| − | ! scope="col" | Назначение
| |
| − | |-
| |
| − | | MM
| |
| − | | Основная схема для хранения данных
| |
| − | |-
| |
| − | | AU
| |
| − | | Аудит данных. История изменения
| |
| − | |-
| |
| − | | HT
| |
| − | | Архивные данные
| |
| − | |}
| |
| − | | |
| − | == Табличные пространства==
| |
| − | | |
| − | Данные и индексы хранить в разных таблспейсах USR_DATA и USR _INDX . Данные аудита хранить в таблеспейсах LOG_DATA и LOG_INDX. Архивные данные в схемах HST_DATA и HST_INDX.
| |
| − | | |
| − | {| width="90%" border="1" cellpadding="0" cellspacing="0"
| |
| − | |-
| |
| − | ! scope="col" | Tablespace
| |
| − | ! scope="col" | Назначение
| |
| − | |-
| |
| − | | USR_DATA
| |
| − | | таблицы данных из схемы MIS
| |
| − | |-
| |
| − | | USR_INDX
| |
| − | | индексы из схемы MIS
| |
| − | |-
| |
| − | | LOG_DATA
| |
| − | | Данные аудита
| |
| − | |-
| |
| − | | LOG_INDX
| |
| − | | Архивные данные
| |
| − | |-
| |
| − | | HST_DATA
| |
| − | | Индексы архива
| |
| − | |-
| |
| − | | HST_INDX
| |
| − | | Индексы аудита
| |
| − | |}
| |
| − | | |
| − | == AUDIT ==
| |
| − | | |
| − | | |
| − | == Резервное копирование ==
| |
| − | | |
| − | Должна быть разработана концепция резервного копирования с помощью rman
| |
| − | | |
| − | == Разделение данных на оперативные данные и архивные. ==
| |
| − | | |
| − | Таблицы, которые относятся к архивным данным хранить в схеме MIS_HST, таблспейсы HST_DATA, HST_INDX
| |
| − | | |
| − | | |
| − | == Верификация ==
| |
| − | | |
| − | Скрипты для верификации именования и расположения объектов находятся:
| |
| − | | |
| − | TODO переделать svn://192.168.1.2/MIS2/DOC/DB/SCRIPTS
| |
| − | | |
| − | == Ссылки ==
| |
| − | | |
| − | * Схема данных храниться в [[PowerDesigner]] в общем репозитарии [[http://192.168.1.9/mediawiki/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%B0%D1%80%D0%B8%D1%8E_Sybase_Power_Designer]]
| |
| − | | |
| − | [[Категория:Postgresql]] [[Категория:MIS3]]
| |