"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу
Пример Юникод программирования на OCI с instance client без пароля
Современное популярное программное обеспечение, использующее последние версии Oracle, зачастую задействует драйверы и вызовы библиотек, разработанные более 15-ти лет назад для версии 8 или даже 7. Это обусловлено сложившимся мнением о сложности программирования на Oracle Call Interface и нежеланием разработчиков современных языков и платформ обновлять промежуточный интерфейс к базе данных.
В то же время, за последние годы OCI претерпел значительные изменения, упростившие процесс разработки и сделавшие его сравнительно простым и изящным.
В предлагаемой заметке я привожу пример работающей программы, демонстрирующей современные способы программирования на OCI, прозрачное использование Юникод, подключение к базе данных без пароля через Oracle Wallet и посредством только библиотек легковесного instant client. Я надеюсь убедить читателя в том, что программирование на современном OCI практически не отличается по сложности от непосредственной работы с библиотеками SQLite и Apache APR, предоставляя при этом большой выигрыш в эффективности программ. Используя OCI в вашем проекте "напрямую", вы сможете исключить несколько "слоёв" устаревшего кода, выполняя SQL запросы и получая результаты из базы быстрее и с меньшими затратами ресурсов компьютеров сервера и клиента.
Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:
.................. == От Матфея святое благовествование == .....................
=== Глава 7, Стих 2 ===
1 Не судите, да не судимы будете,
2 ибо каким судом судите, таким будете судимы; и какою мерою мерите,
такою и вам будут мерить.
3 И что ты смотришь на сучок в глазе брата твоего, а бревна в твоем глазе не
чувствуешь?
4 Или как скажешь брату твоему: "дай, я выну сучок из глаза твоего", а вот, в
твоем глазе бревно?
5 Лицемер! вынь прежде бревно из твоего глаза и тогда увидишь, как вынуть
сучок из глаза брата твоего.
6 Не давайте святыни псам и не бросайте жемчуга вашего перед свиньями, чтобы
они не попрали его ногами своими и, обратившись, не растерзали вас.
Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошёл на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное.
Отец наш Бог любит нас настолько сильно, что пожертвовал Своим Сыном для нашего с вами спасения, дорогой читатель. Насколько же безмерна и велика любовь Божия к нам, грешникам! И эта любовь распространяется на всех людей - всем нам Господь даёт возможность спастись через покаяние. При этом Сам Бог задерживает до времени Страшный Суд, чтобы больше спаслось.
Что же делаем мы с вами? Люди, грешившие всю свою жизнь - мы судим наших братьев и сестёр, хотя не имеем на это никакого права! Встречаясь в повседневной жизни, мы так быстро осуждаем своих родных, коллег, знакомых, соседей... Составляем мнения, распространяем сплетни, перешёптываемся за спиной. А ведь на самом деле мы имеем право осуждать только себя самих, ведь за нами самими числится столько, что может и всей жизни не хватить на искупление... Если подумать об этом - сразу же понятно что некогда нам осуждать других - дал бы Бог в нашем собственном спасении преуспеть, ибо грехов-то так много, что тянут и гнут к земле, как тот самый мельничный жёрнов на шее!
Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.
Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.
На главной странице этого сайта вы найдете программу для чтения Библии в командной строке - буду очень рад если программа окажется полезной. Пожалуйста, читайте Библию, на экране или в печатном виде - вы будете искренне удивлены как много там сказано лично про вас и ваши обстоятельства.
Вернёмся к нашим техническим деталям.
В начале заметки я подробно рассмотрю общий процесс создания Oracle wallet и подключения к базе. Этот подход будет использоваться и в программе, не требующей ни имени пользователя, ни пароля.
Далее я приведу исходный код программы, в котором подробно разъясняется как:
После удачной компиляции программа сможет подключаться к базе данных, читать SQL запрос пользователя из потока стандартного ввода, подготавливать и выполнять запрос, эффективно получать из базы набор данных результата и выводить его в поток стандартного вывода в виде CSV строк, выводить статистику выполнения запроса (stats, events / waits, IO).
Даже в таком упрощённом виде программа оказывается полезной для оценки производительности сервера и для тестирования индивидуальных SQL запросов. Но основное назначение примера - предоставить читателю "шаблон" современной OCI программы для последующего наращивания функциональности.
Создание Oracle wallet и подключение к базе без пароля
Создание внешнего хранилища паролей будет изначально производится на сервере базы данных Oracle, а затем созданные контейнеры будут перенесены на компьютер клиента.
Подготовка внешнего хранилища паролей на сервере БД
Подготовим директории для хранения нашего Oracle wallet. Соответствие имён пользователей операционной системы между сервером и клиентом не требуется - как видно, все действия на сервере я произвожу как linux пользователь "oracle", в то время как клиент будет использовать другое имя.
Затем создадим хранилище паролей, проверим наличие файлов и их содержание.
................... == От Луки святое благовествование == ...................... === Глава 16, Стих 13 === 11 Итак, если вы в неправедном богатстве не были верны, кто поверит вам истинное? 12 И если в чужом не были верны, кто даст вам ваше? 13 Никакой слуга не может служить двум господам, ибо или одного будет ненавидеть, а другого любить, или одному станет усердствовать, а о другом нерадеть. Не можете служить Богу и маммоне. (b+/b-, c+/c-, +/-, *) > [oracle@ouldb admin]$ id uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba) - Создание каталога. [oracle@ouldb admin]$ mkdir /home/oracle/wallets [oracle@ouldb admin]$ - Создание самого wallet, использующего auto-login (но не локальный!) [oracle@ouldb ~]$ orapki wallet create -wallet /home/oracle/wallets -auto_login -pwd ... - Проверим наличие файлов. [oracle@ouldb wallets]$ pwd /home/oracle/wallets [oracle@ouldb wallets]$ ls -la total 16 drwxr-xr-x 2 oracle oinstall 4096 Aug 3 12:48 . drwx------ 13 oracle oinstall 4096 Aug 3 12:44 .. -rw------- 1 oracle oinstall 2901 Aug 3 12:48 cwallet.sso -rw------- 1 oracle oinstall 0 Aug 3 12:48 cwallet.sso.lck -rw------- 1 oracle oinstall 2856 Aug 3 12:48 ewallet.p12 -rw------- 1 oracle oinstall 0 Aug 3 12:48 ewallet.p12.lck [oracle@ouldb wallets]$ - Проверим файлы - команда не должна спрашивать пароль. [oracle@ouldb wallets]$ orapki wallet display -wallet /home/oracle/wallets Oracle PKI Tool : Version 12.1.0.1 Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. Requested Certificates: User Certificates: Trusted Certificates: Subject: OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US Subject: OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US Subject: CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE ... Subject: OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US [oracle@ouldb wallets]$
Как видно, wallet создан пустым. Теперь нам надо добавить в него хотя бы одну запись. Впоследствии можно превратить этот wallet в хранилище ваших логинов во все базы данных Oracle, полностью исключив ввод паролей. Для этой цели нам необходимо знать (и использовать для последующих подключений) полное доменное имя сервера базы данных. Создав запись для комбинации полного имени сервера Oracle, имени пользователя в базе и его пароля, проверим наличие добавленной информации.
......................... == Третья книга Ездры == ............................. === Глава 9, Стих 10 === 10 Те, которые не познали Меня, получая при жизни благодеяния, 11 и возгнушались законом Моим, не уразумели его, но презрели, когда еще имели свободу и когда еще отверсто было им место для покаяния, 12 те познают Меня по смерти в мучении. (b+/b-, c+/c-, +/-, *) > - Получим FQDN имя сервера БД: [oracle@ouldb ~]$ grep ouldb /etc/hosts 192.168.56.200 ouldb.localdomain ouldb [oracle@ouldb ~]$ - Добавим логин, используя полученное имя сервера. Понадобится ввести пароль wallet: [oracle@ouldb ~]$ mkstore -wrl /home/oracle/wallets \ -createCredential //ouldb.localdomain:1521/DB scott tiger Oracle Secret Store Tool : Version 12.1.0.1 Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. Enter wallet password: Create credential oracle.security.client.connect_string1 [oracle@ouldb ~]$ - проверим структуру хранилища (потребуется ввод пароля wallet): [oracle@ouldb ~]$ mkstore -wrl /home/oracle/wallets -list Oracle Secret Store Tool : Version 12.1.0.1 Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. Enter wallet password: Oracle Secret Store entries: oracle.security.client.connect_string1 oracle.security.client.password1 oracle.security.client.username1 [oracle@ouldb ~]$ - убедимся что учётная запись была создана - вновь понадобится пароль wallet: [oracle@ouldb ~]$ mkstore -wrl /home/oracle/wallets -listCredential Oracle Secret Store Tool : Version 12.1.0.1 Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. Enter wallet password: List credential (index: connect_string username) 1: //ouldb.localdomain:1521/DB scott [oracle@ouldb ~]$
Несмотря на то, что нам понадобилось вводить пароль хранилища при каждом обращении к команде "mkstore", для обычного использования пароль wallet не понадобится - подключение будет происходить автоматически. Мы лишь должны использовать то же самое имя сервера (из поля под названием oracle.security.client.connect_string1) и то же самое имя пользователя (из oracle.security.client.username1) для подключения.
Тестирование созданного Oracle Wallet
Перед использованием учётной записи из внешнего хранилища, мы должны уведомить Oracle Network Services о его местонахождении. Делается это путём внесения записей в файл "sqlnet.ora". Заметьте - мы всё ещё работаем с сервером БД.
- sqlnet.ora, все слова в WALLET_LOCATION должны быть на одной строке! [oracle@ouldb ~]$ cat $ORACLE_HOME/network/admin/sqlnet.ora WALLET_LOCATION=(SOURCE=(METHOD = FILE)(METHOD_DATA=(DIRECTORY=/home/oracle/wallets))) SQLNET.WALLET_OVERRIDE = TRUE SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 0 #TRACE_LEVEL_CLIENT=16 [oracle@ouldb ~]$
Теперь мы попробуем произвести "локальное" подключение, использующее Oracle Wallet - программа клиент (SQLPlus) на сервере будет подключаться к базе данных на этом же самом сервере. Никакие файлы ещё не были перенесены на клиентский компьютер. Вместо имени пользователя используется "/". Обратите внимание, что такой способ подключения не имеет ничего общего с "OPS$" логинами - мой пользователь в базе данных не имеет соответствующего EXTERNAL_NAME и OS Authentication в моей базе отключена.
................ == Книга Премудрости Соломона == .................... === Глава 10, Стих 11 === 11 Когда из корыстолюбия обижали его, она предстала и обогатила его, 12 сохранила его от врагов, и обезопасила от коварствовавших против него, и в крепкой борьбе доставила ему победу, дабы он знал, что благочестие всего сильнее. (b+/b-, c+/c-, +/-, *) > [oracle@ouldb ~]$ sqlplus /@//ouldb.localdomain:1521/DB SQL*Plus: Release 12.1.0.1.0 Production on Sat Aug 3 12:57:09 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Last Successful login time: Sat Aug 03 2013 12:29:08 +02:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options 12:57:10 SQL>
Напечатав в приглашении "show user" мы увидим имя "scott" - оно было записано в поле "oracle.security.client.username1" и именно под этим именем была подключена наша сессия к службе DB.
Вполне возможно что подключение не состоится, выдав ошибку "ORA-12578: TNS:wallet open failed" или подобную ей. Обнаружить причину достаточно просто - включите трассировку подключения на клиенте, установив значение TRACE_LEVEL_CLIENT=16 в "sqlnet.ora" файле (в моём примере выше эта строка уже есть, но закомментирована). Файлы трассировки наверняка будут находиться в директории $ORACLE_BASE.
less /home/oracle/app/oracle/diag/clients/user_oracle/host_80/trace/ora_3686_14020578.trc 2013-08-03 12:17:45.115935 : nlstdts_trace_source:Attempted load of system pfile source /home/oracle/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora 2013-08-03 12:17:45.115970 : nlstdts_trace_source:Load contained errors 2013-08-03 12:17:45.116125 : nlstdts_trace_source:Error stack follows: NL-00427: bad list -- Вот она, ошибка! ... 2013-08-03 12:17:45.174488 : nzsuppgp_get_parameter:value retrieved for parameter "WALLET_LOCATION": "(SOURCE =". -- А вот и причина! ... -- После помещения всех слов на одну строку при следующей попытке получим: ... 2013-08-03 12:26:36.398276 : nzsuppgp_get_parameter:value retrieved for parameter "WALLET_LOCATION": "(SOURCE=(METHOD = FILE)(METHOD_DATA=(DIRECTORY=/home/oracle/app/oracle/product/12.1.0/db home_1/network/admin/wallets)))". 2013-08-03 12:26:36.398286 : nzsuppgp_get_parameter:exit ... 2013-08-03 12:26:36.398585 : nzsuppwl_wallet_lookup:Resulting value: Parameter "WALLET_LOCATION" Method: "FILE" Filename: "/home/oracle/app/oracle/product/12.1.0/dbhome_1/network/admin/wallets/cwallet.sso" 2013-08-03 12:26:36.398596 : nzsuppwl_wallet_lookup:exit 2013-08-03 12:26:36.398607 : nziropen:entry 2013-08-03 12:26:36.398627 : nzdfo_open:entry 2013-08-03 12:26:36.398638 : snzdfo_open_file:entry 2013-08-03 12:26:36.398726 : Opening file /home/oracle/app/oracle/product/12.1.0/dbhome_1/network/admin/wallets/ewallet.p12 with READ ONLY permissions 2013-08-03 12:26:36.398780 : nziropen:entry 2013-08-03 12:26:36.398795 : nzdfo_open:entry 2013-08-03 12:26:36.398806 : snzdfo_open_file:entry 2013-08-03 12:26:36.398916 : Opening file /home/oracle/app/oracle/product/12.1.0/dbhome_1/network/admin/wallets/cwallet.sso with READ ONLY permissions 2013-08-03 12:26:36.398940 : nzirretrieve:entry 2013-08-03 12:26:36.398952 : nzdfr_reset:entry 2013-08-03 12:26:36.398981 : nzdfr_reset:exit
Итак, мы уже нашли и устранили ошибку в разметке файла "sqlnet.ora". Попробуем подключение заново:
== Второе послание к Фессалоникийцам (Солунянам) святого апостола Павла == .... === Глава 2, Стих 16 === 16 Сам же Господь наш Иисус Христос и Бог и Отец наш, возлюбивший нас и давший утешение вечное и надежду благую во благодати, 17 да утешит ваши сердца и да утвердит вас во всяком слове и деле благом. (b+/b-, c+/c-, +/-, *) > [oracle@ouldb trace]$ sqlplus /@//ouldb.localdomain:1521/DB SQL*Plus: Release 12.1.0.1.0 Production on Sat Aug 3 12:29:08 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Last Successful login time: Sat Aug 03 2013 11:47:15 +02:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> show user USER is "SCOTT" SQL>
Нам удалось подключиться к серверу БД под именем пользователя "scott" без пароля, используя Oracle Wallet. Но до этого мы использовали библиотеки из состава "полного клиента" Оракл, находящегося на самом сервере. Теперь нам надо организовать подобный процесс на удалённом клиенте, имеющем только минимальные библиотеки из состава "instant client".
Перемещение внешнего хранилища паролей на клиентский компьютер
Поскольку мы уже убедились в работоспособности нашего wallet, просто перенесём все файлы с сервера БД на клиентский компьютер, поместив их в то же самое (или любое другое) место. Имя пользователя ОС на клиенте также не имеет значения.
- Подготовим директорию [user@client ~]$ cd oraclient/instantclient_12_1/ [user@client instantclient_12_1]$ pwd /home/user/oraclient/instantclient_12_1 [user@client instantclient_12_1]$ [user@client instantclient_12_1]$ mkdir wallets - Переместим файлы и установим правильные разрешения. [user@client instantclient_12_1]$ scp oracle@192.168.56.200: \ /home/oracle/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora . sqlnet.ora 100% 191 0.2KB/s 00:00 [user@client instantclient_12_1]$ scp oracle@192.168.56.200: \ /home/oracle/wallets/* wallets/ cwallet.sso 100% 3285 3.2KB/s 00:00 cwallet.sso.lck 100% 0 0.0KB/s 00:00 ewallet.p12 100% 3240 3.2KB/s 00:00 ewallet.p12.lck 100% 0 0.0KB/s 00:00 [user@client instantclient_12_1]$ chown -R user:user wallets/ [user@client instantclient_12_1]$ ls -la wallets/ total 16 drwxrwxr-x 2 user user 4096 Aug 3 13:07 . drwxrwxr-x 4 user user 4096 Aug 3 13:06 .. -rw------- 1 user user 3285 Aug 3 13:07 cwallet.sso -rw------- 1 user user 0 Aug 3 13:07 cwallet.sso.lck -rw------- 1 user user 3240 Aug 3 13:07 ewallet.p12 -rw------- 1 user user 0 Aug 3 13:07 ewallet.p12.lck [user@client instantclient_12_1]$
Переместив файлы, мы должны изменить содержимое "sqlnet.ora" и установить переменные среды соответствующим образом. Заметьте, что сейчас я выполняю все эти действия на компьютере клиента, который подключается к серверу БД удалённо по сети и не имеет "полной" версии Oracle client. Мой клиент имеет только "облегчённую" версию Oracle Instant Client, находящуюся в "/home/user/oraclient/instantclient_12_1". Ниже я привожу полный список библиотек и файлов, находящихся в директории Instant Client:
.......................... == Книга Екклезиаста == ............................. === Глава 7, Стих 25 === 24 Далеко то, что было, и глубоко - глубоко: кто постигнет его? 25 Обратился я сердцем моим к тому, чтобы узнать, исследовать и изыскать мудрость и разум, и познать нечестие глупости, невежества и безумия, - 26 и нашел я, что горче смерти женщина, потому что она - сеть, и сердце ее - силки, руки ее - оковы; добрый пред Богом спасется от нее, а грешник уловлен будет ею. (b+/b-, c+/c-, +/-, *) > [user@client instantclient_12_1]$ ls -la total 212992 drwxrwxr-x 5 user user 4096 Aug 28 15:02 . drwxrwxr-x. 4 user user 4096 Jul 31 07:03 .. -rwxrwxr-x 1 user user 29396 May 25 03:20 adrci -rw-rw-r-- 1 user user 440 May 25 03:20 BASIC_README -rwxrwxr-x 1 user user 43154 May 25 03:20 genezi -r-xr-xr-x 1 user user 342 May 25 03:20 glogin.sql -rwxrwxr-x 1 user user 6750135 May 25 03:20 libclntshcore.so.12.1 -rwxrwxr-x 1 user user 55453863 May 25 03:20 libclntsh.so.12.1 -r-xr-xr-x 1 user user 6277261 May 25 03:20 libnnz12.so -rwxrwxr-x 1 user user 2523156 May 25 03:20 libocci.so.12.1 -rwxrwxr-x 1 user user 136162781 May 25 03:20 libociei.so -r-xr-xr-x 1 user user 152544 May 25 03:20 libocijdbc12.so -r-xr-xr-x 1 user user 330074 May 25 03:20 libons.so -rwxrwxr-x 1 user user 114225 May 25 03:20 liboramysql12.so -r-xr-xr-x 1 user user 1561402 May 25 03:20 libsqlplusic.so -r-xr-xr-x 1 user user 1535672 May 25 03:20 libsqlplus.so drwxrwxr-x 2 user user 4096 Aug 22 11:58 log -rw-rw-r-- 1 user user 215 Jul 30 17:22 login.sql -r--r--r-- 1 user user 3389454 May 25 03:20 ojdbc6.jar -r--r--r-- 1 user user 3397734 May 25 03:20 ojdbc7.jar -rw-r--r-- 1 user user 226 Aug 22 11:42 sqlnet.ora -r-xr-xr-x 1 user user 9477 May 25 03:20 sqlplus -rw-rw-r-- 1 user user 444 May 25 03:20 SQLPLUS_README -rwxrwxr-x 1 user user 219437 May 25 03:20 uidrvci drwxrwxr-x 2 user user 4096 Aug 3 13:07 wallets -rw-rw-r-- 1 user user 71231 May 25 03:20 xstreams.jar [user@client instantclient_12_1]$
Итак, установим необходимые переменные среды (занесите их в соответствующий файл конфигурации типа .bashrc) и отредактируем фаил "sqlnet.ora".
export ORACLE_HOME=/home/user/oraclient/instantclient_12_1 export PATH=$ORACLE_HOME:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME export TNS_ADMIN=$ORACLE_HOME export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export NLS_DATE_FORMAT="DD-MON-RR HH24:MI:SS" - Изменённый sqlnet.ora должен указывать на текущее местоположение wallet. - Расположите все записи WALLET_LOCATION на одной строке. WALLET_LOCATION=(SOURCE=(METHOD = FILE) (METHOD_DATA=(DIRECTORY=/home/user/oraclient/instantclient_12_1/wallets))) SQLNET.WALLET_OVERRIDE = TRUE SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 0 #TRACE_LEVEL_CLIENT=16
Тестирование Oracle Wallet на клиенте
Всё готово к тестированию нашего подключения без ввода пароля. Вначале я удостоверюсь что мой сервер БД доступен по полному имени, записанному в wallet как параметр "oracle.security.client.connect_string1". Затем я попробую подключиться к удалённой службе DB на сервере базы данных.
......... == Первое послание к Коринфянам святого апостола Павла == ............ === Глава 13, Стих 13 === 13 А теперь пребывают сии три: вера, надежда, любовь; но любовь из них больше. (b+/b-, c+/c-, +/-, *) > [user@client instantclient_12_1]$ grep ouldb /etc/hosts 192.168.56.200 ouldb.localdomain ouldb [user@client instantclient_12_1]$ [user@client instantclient_12_1]$ ping ouldb.localdomain PING ouldb.localdomain (192.168.56.200) 56(84) bytes of data. 64 bytes from ouldb.localdomain (192.168.56.200): icmp_seq=1 ttl=64 time=0.323 ms 64 bytes from ouldb.localdomain (192.168.56.200): icmp_seq=2 ttl=64 time=0.240 ms - Попытаемся подключиться с Instant Client к серверу БД: [user@client instantclient_12_1]$ sqlplus /@//ouldb.localdomain:1521/DB SQL*Plus: Release 12.1.0.1.0 Production on Sat Aug 3 13:17:59 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Last Successful login time: Sat Aug 03 2013 12:57:10 +02:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options 13:18:00 SQL>
Подключение прошло успешно - при этом нам не пришлось вводить пароль и имя пользователя. Теоретически, мы можем их даже и не знать - и всё равно сможем работать с базой, подключаясь через wallet.
При изменении имени пользователя или его пароля в БД нам понадобится повторить процесс с самого начала или, переместив wallet обратно на сервер БД, обновить учётную запись (через "mkstore -modifyCredential") и вернуть wallet на компьютер "облегчённого" клиента. На практике смена паролей не представляет затруднений - храня копии нужных wallet на сервере БД, все их можно обновлять централизовано и затем "выгружать" на клиентов после изменения записей пользователей в базе данных Oracle.
Исходный код "шаблона" современной OCI программы
Теперь, когда мы можем подключаться к БД без ввода пароля в SQL*Plus, посмотрим как можно применить этот же подход в пользовательской программе. Загрузите по ссылке внизу исходный текст - я старался комментировать каждый шаг и уверен что у вас не возникнет трудностей с компиляцией и запуском программы.
В этой заметке я не буду рассматривать логику программы и её работу - для этого существует исходный код. В самом начале я рассказал вкратце о возможностях программы. Повторю, что я старался показать простоту использования Oracle Call Interface и его гибкость и эффективность.
Для компиляции программы вам понадобится дополнительный Instant Client Package - SDK: Additional header files and an example makefile for developing Oracle applications with Instant Client.
Исходный код программы (с комментариями)
Спасибо что зашли,
Будьте благословенны!
Денис
1 Сентября 2013 года.