Программирование >>  Oracle 

1 ... 356 357 358 [ 359 ] 360 361 362 ... 469


1498 Глава 22

checkerr(error handle,

OCISvcCtxToLda(application server service handle, error handle, &lda )

return lda;

Последняя часть кода - функция checkerr, которую мы многократно использовали. Эта функция проверяет, что коды возврата OCI-функций свидетельствуют об успешном выполнении - в противном случае она выдает сообщение об ошибке и завершает работу программы:

void checkerr(OCIError * errhp, sword status)

text errbuf[512];

sb4 errcode = 0;

switch (status)

case OCI SUCCESS:

break;

case OCI SUCCESS WITH INFO:

(void) printf( 0шибка - OCI SUCCESS WITH INFO\n );

break; case OCI NEED DATA:

(void) printf( Ошибка - OCI NEED DATA\n );

break; case OCI NO DATA:.

(void) printf( Ошибка - OCI NODATA\n );

break; case OCI ERROR:

(void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NLL &errcode, errbuf, (ub4) sizeof(errbuf), OCI HTYPE ERROR); (void) printf( Ошибка-%.*s\n , 512, errbuf); exit(l);

break;

case OCI INVALID HANDLE:

(void) printf( 0шибка - OCI INVALID HANDLE\n );

break;

case OCI STILL EXECUTING:

(void) printf( Ошибка - OCI STILL EXECUTE\n );

break; case OCI CONTINUE:

(void) printf( 0шибка - OCI CONTINUE\n );

break;

default: break;

Теперь осталось изменить файл cdemo2.c и включить в него необходимый код. Существующий код этой демонстрационной программы имеет вид:



Многоуровневая аутентификация 1499

static sword numwidth = 8; main()

sword col, errno, n, ncols;

text *cp;

/* Подключаемся к ORAGLE. */ if (connect user()) exit(-l);

Изменение очень несложное - добавить код, выделенный полужирным:

static sword numwidth = 8;

Lda Def connect8i(int argc, char * argv[]);

main(int argc, char * argv[])

sword col, errno, n, ncols;

text *cp;

/* Подключаемся к ORAGLE. */ /*

if (connect user()) exit(-l);

Ida = connect8i( argc/ argv );

Затем надо добавить весь представленный ранее код (функции connect8i и checkerr) в конец файла исходного кода. Сохраняем файл и компилируем.

В ОС UNIX для компиляции надо выполнить следующую команду:

$ make -f $ORACLE HOME/rdbms/demo/demo rdbms.mk cdemo2

В среде Windows NT я использовал следующий файл управления проектом makefile:

GPU=i386

WORK DIR = . \

!include <\msdev\include\win32.mak> OBJDIR = $(WORK DIR)\ #

EXEDIR = $(WORK DIR)\ # каталог, в который будут помещаться все -> .ехе-моли

ORAGLE HOME = \oracle

TARGET = $(EXEDIR)cdemo2.exe SAMPLEOBJS = cdemo2.obj

LOGAL DEFINE = -DWIN NT

SYSLIBS = \msdev\lib\msvcrt.lib \

\msdev\lib\oldnames.lib \ \msdev\lib\kernel32.lib \



1500 Глава 22

\msdev\lib\advapi32.lib \ \msdev\lib\wsock32.lib

NTUSER32LIBS = \msdev\lib\user32.1ib \

\msdev\lib\advapi32.1ib \

\msdev\lib\libc.lib SQLLIB = $(ORACLE HOME)\oci\lib\msvc\oci.lib

INCLS = -I\msdev\include \

-I$(ORACLE HOME)\oci\include

CFLAGS = $(cdebug) $(cflags) $(INCLS) $(LOCAL DEFINE)

LINKOPT = /nologo /subsystem:console /machine:I386 /nodefaultlib

$(TARGET): $(SAMPLEOBJS) $(SQLLIB) $(link) $(LINKOPT) \ -out:$(TARGET) $(SAMPLEOBJS) \

$(NTUSER32LIBS) \

$(SYSLIBS) \

$(SQLLIB)

A затем просто выполнял для компиляции команду nmake:

c:\oracle\rdbms\demo>nmake

Теперь можно доверять работу программы:

c:\oracle\rdbms\demo>cdemo2 tkyte/tkyte scott connect,resource Ошибка - ORA-28150: proxy not authorized to connect as client

Итак, пока еще не работает, но до успешного выполнения осталось совсем немного. Необходимо предоставить промежуточной учетной записи (TKYTE) право подключаться от имени клиента базы данных (SCO). Регистрируемся в SQL*Plus и вгполняем:

sys@TKYTE816> alter user scott grant connect through tkyte; User altered.

Подробно этот новый оператор со всеми опциями мы рассмотрим немного позже. Пока нам просто надо убедиться, что программа работает. Обратите внимание на в]де-ленное полужирн1м приглашение - я работаю не в среде SQL*Plus. Это работает демонстрационная программа cdemo2, очень похожая на утилиту SQL*Plus:

c:\oracle\rdbms\demo>cdemo2 tkyte/tkyte scott connect,resource

OCISQL> SELECT user, substr(sys context(userenv,proxy user),l,30)

2 FROM dual;

USER SUBSTR(SYS CONTEXT(USERENV,PRO

SCOTT TKYTE

1 row processed.

OCISQL> select * from session roles; ROLE

CONNECT RESOURCE

2 rows processed.



1 ... 356 357 358 [ 359 ] 360 361 362 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика