Часто задаваемые вопросы по OpenEdge RDBMS
XII. Подключение баз данных
Смотри раздел о разделяемой памяти для дополнительных связанных вопросов.
90. Как подключиться к одной и той же базе данных дважды?
Все подключенные базы данных имеют логическое и физическое имя. Если вы не указываете логическое имя, то логическое имя будет совпадать с последней частью физического имени. Указывая различные логические имена, вы можете подключиться к одной и той же базе данных дважды в одной сессии, а затем в коде ссылаться на базу данных по различным логическим именам.
Когда вы используете self-serving подключения, некоторые операционные системы (например, HP-UX) не позволяют процессу подключиться к одному и тому же сегменту разделяемой памяти более одного раза. Что не позволит вам подключиться к базе данных более одного раза, даже если вы используете разные логические имена, кроме случая, когда вы используете одно (или ни одного) self-serving подключение, а другие (или все) подключения являются сетевыми.
91. Почему происходит ошибка оператора CONNECT, а подключение в командной строке работает?
Когда вы запускаете сервер базы данных (процесс, который запускается командой preserve, называется «брокер»; он запускает процессы серверов по мере необходимости) и он создает сегменты разделяемой памяти, он устанавливает биты доступа к сегментам разделяемой памяти аналогично битам доступа к файлу базы данных «.db». Если вы измените биты доступа к файлу «.db» после запуска сервера, это не окажет эффекта на уже установленные права доступа к сегментам разделяемой памяти, так как сервер уже получил информацию о правах доступа к файлу «.db» во время инициализации и не будет делать этого снова.
Когда вы запускаете исполняемый файл _progres, и он является setuid root (принадлежит пользователю root и бит setuid включен), то он начинает выполняться с расширенными правами, а не с правами вашего пользователя. После завершения инициализации, включая открытие файлов базы данных и подключение сегментов разделяемой памяти, расширенные привилегии понижаются до привилегий пользователя, который запустил процесс (например, до ваших). После этого выполняется 4GL код. Это позволяет приложению иметь доступ к базе данных, даже если ваш пользователь не имеет прав на чтение соответствующих файлов. Так что код 4GL может иметь доступ к данным в базе (или к части их), но вы не можете использовать vi или другие программы для просмотра или модификации базы данных, или делать ее копии.
Оператор 4GL CONNECT всегда выполняется с нормальными привилегиями, и никогда с расширенными, предоставляемыми битом setuid. Весь код 4GL выполняется после того, как программа _progres отдала расширенные привилегии. Это является причиной того, что вы получаете ошибку 1136.