среда, 17 апреля 2013 г.

DBMS_LDAP Example. Пример кода работы с пакетом DBMS_LDAP

Как написать простейший код, работающий с LDAP-каталогом, с использованием пакета DBMS_LDAP

Наверно вам уже приходилось сталкиваться с ситуацией, когда надо напрямую из БД Oracle обратиться за данными, находящимися в LDAP-каталоге.
Для этого существует прекрасный стандартный пакет DBMS_LDAP.
Ниже приведу пример кода, где мы хотим получить cn пользователя, зная его DN.

Declare
  ldap_session DBMS_LDAP.session:=null;
  ErrorMsg VARCHAR2(4000);
-- значение атрибута
  my_attr_value varchar2(256);      
  entry_dn varchar2(256);
  my_vals DBMS_LDAP.STRING_COLLECTION;
  my_ber_elmt DBMS_LDAP.ber_element;
  my_attrs DBMS_LDAP.STRING_COLLECTION;
  my_attr_name varchar2(256);
  my_message DBMS_LDAP.message;
  my_entry DBMS_LDAP.message;
  ret_val PLS_INTEGER:=-1;
-- distinguished name пользователя
  userDN varchar2(2000):='uid=iivanov,ou=People,dc=maxcrc,dc=com';
BEGIN
  my_attrs(1):='cn';
 
-- создание LDAP session handle (адрес сервера, порт)
  ldap_session := DBMS_LDAP.init('asusnote','389');
 
-- админ, его пароль
  ret_val := DBMS_LDAP.simple_bind_s(ldap_session,'cn=Manager,dc=maxcrc,dc=com','secret');  
   
-- ищем пользователя
  ret_val := DBMS_LDAP.search_s(ldap_session,
                                userDN,
                                DBMS_LDAP.SCOPE_BASE,
                                'objectclass=inetorgperson',
                                my_attrs,
                                0,
                                my_message);

  dbms_output.put_line('Debug :: ret_Val expected is 0, found = '|| ret_val);
  dbms_output.put_line('Debug :: if ret_Val != 0 then ckeck dbms_ldap package for error code');

-- получить значение атрибута из результатов поиска
  my_entry := DBMS_LDAP.first_entry(ldap_session, my_message);
  my_attr_name := DBMS_LDAP.first_attribute(ldap_session,my_entry,my_ber_elmt);
  my_vals := DBMS_LDAP.get_values (ldap_session, my_entry, my_attr_name);
  my_attr_value := my_vals(0);

  dbms_output.put_line('Debug :: '|| my_attr_name || ' = ' || my_attr_value);
 
EXCEPTION
 WHEN others THEN
   ErrorMsg := SQLERRM;
   dbms_output.put_line('Error :: ' || ErrorMsg);
END;

суббота, 13 апреля 2013 г.

Oracle Database. Как восстановить утраченный файл данных БД Oracle (ORA-01157, ORA-01110, ORA-27041, OSD-04002)

Восстановление файла данных БД Oracle в случае его утраты

Если в консоли или alert.log вашей БД вы обнаружили подобную ошибку:
Errors in file D:\APP\ASUS\diag\rdbms\orcl\orcl\trace\orcl_dbw0_8104.trc:
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01110: data file 10: 'D:\APP\ASUS\ORADATA\ORCL\DEV_OIM.DBF'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) Не удается найти указанный файл.
Errors in file D:\APP\ASUS\diag\rdbms\orcl\orcl\trace\orcl_ora_6572.trc:
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01110: data file 10: 'D:\APP\ASUS\ORADATA\ORCL\DEV_OIM.DBF'
ORA-1157 signalled during: alter database open...
то это значит, что БД Oracle не может открыть один из файлов данных, например, с номером 10.

Для восстановления необходимо выполнить следующие действия:

1. Подключитесь к вашей БД с помощью утилиты RMAN

$ rman target / catalog ORCL/*****@rcat

2. Выполните команду восстановления файла данных

RMAN> restore datafile 10;

3. Накатите на файл данных redo-информацию до текущего состояния:

RMAN> recover datafile 10;

4. Откройте БД, если она не открыта:

$ $ORACLE_HOME/bin/srvctl start database -d ORCLdb