fossil
22-03-2012, 14:29
Доброго времени суток!
Делюсь с вами своей проблемой, так как после потраченного рабочего дня на поиски решения, я расписался в собственном бессилии.
Программа пишется в консольном режиме. Необходимо чтобы она совершала некоторые операции в базе данных.
Для выполнения большинства скриптов программе нужны привилегии пользователя SYS под SYSDBA.
Привожу программный код получившейся программы.
При попытке выполнить данную программу под пользователем SYS вылетает ошибка
TDBXError: ORA-28009: connection to sys should be as sysdba or sysoper
Если выполнять данные действия под пользователем SYSTEM, то код вполне рабочий.
В интернете прочитал о том, что для подключения под ролью SYSDBA необходимо использовать .NET (если действительно так, то мне необходимы примеры).
Заранее хочу сообщить, что в строку инициализации были попытки ввести параметры подключения "DBA Privilege=SYSDBA", а также "RoleName=sysdba"
Заранее благодарен за любую помощь!
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, WinSvc, ShellApi, Registry, SqlExpr, DbxOracle;
var
dbpath:string='C:\Oracle\ora92';
dbname:string='database';
dbpass:string='password';
readst:string;
result:boolean;
Reg: TRegistry;
Conn: TSQLConnection;
Query: TSQLQuery;
procedure MyWriteln(const S: string);
var
NewStr: string;
begin
SetLength(NewStr, Length(S));
CharToOem(PChar(S), PChar(NewStr));
Writeln(NewStr);
end;
procedure MyWrite(const S: string);
var
NewStr: string;
begin
SetLength(NewStr, Length(S));
CharToOem(PChar(S), PChar(NewStr));
Write(NewStr);
end;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
MyWrite('Путь до базы данных Oracle ['+dbpath+']: ');
readln(readst);
if (readst<>'') then dbpath:=readst;
if not DirectoryExists(dbpath) then
begin
MyWriteln('ОШИБКА! Путь до базы данных Oracle не найден!');
readln;
Exit;
end;
MyWrite('Имя базы данных ['+dbname+']: ');
readln(readst);
if (readst<>'') then dbname:=readst;
MyWrite('Пароль пользователя SYS ['+dbpass+']: ');
readln(readst);
if (readst<>'') then dbpass:=readst;
MyWrite('Подключаемся к базе данных... ');
Conn := TSQLConnection.Create(nil);
Query := TSQLQuery.Create(nil);
try
try
Conn.ConnectionName:='OracleConnection';
Conn.DriverName := 'Oracle';
Conn.GetDriverFunc:='getSQLDriverORACLE';
Conn.LibraryName:='dbxora30.dll';
Conn.VendorLib:='OCI.DLL';
Conn.Params.Clear;
Conn.Params.Add('DataBase='+dbname);
Conn.Params.Add('User_Name=sys');
Conn.Params.Add('Password='+dbpass);
Conn.LoginPrompt:=false;
Conn.Connected:=true;
Query.SQLConnection := Conn;
Query.SQL.Text := 'SELECT banner FROM v$version';
Query.Open;
while not Query.Eof do begin
Writeln(Query.Fields[0].AsString);
Query.Next;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
Query.Free;
Conn.Free;
end;
readln; //КОНЭЦ
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Делюсь с вами своей проблемой, так как после потраченного рабочего дня на поиски решения, я расписался в собственном бессилии.
Программа пишется в консольном режиме. Необходимо чтобы она совершала некоторые операции в базе данных.
Для выполнения большинства скриптов программе нужны привилегии пользователя SYS под SYSDBA.
Привожу программный код получившейся программы.
При попытке выполнить данную программу под пользователем SYS вылетает ошибка
TDBXError: ORA-28009: connection to sys should be as sysdba or sysoper
Если выполнять данные действия под пользователем SYSTEM, то код вполне рабочий.
В интернете прочитал о том, что для подключения под ролью SYSDBA необходимо использовать .NET (если действительно так, то мне необходимы примеры).
Заранее хочу сообщить, что в строку инициализации были попытки ввести параметры подключения "DBA Privilege=SYSDBA", а также "RoleName=sysdba"
Заранее благодарен за любую помощь!
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, WinSvc, ShellApi, Registry, SqlExpr, DbxOracle;
var
dbpath:string='C:\Oracle\ora92';
dbname:string='database';
dbpass:string='password';
readst:string;
result:boolean;
Reg: TRegistry;
Conn: TSQLConnection;
Query: TSQLQuery;
procedure MyWriteln(const S: string);
var
NewStr: string;
begin
SetLength(NewStr, Length(S));
CharToOem(PChar(S), PChar(NewStr));
Writeln(NewStr);
end;
procedure MyWrite(const S: string);
var
NewStr: string;
begin
SetLength(NewStr, Length(S));
CharToOem(PChar(S), PChar(NewStr));
Write(NewStr);
end;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
MyWrite('Путь до базы данных Oracle ['+dbpath+']: ');
readln(readst);
if (readst<>'') then dbpath:=readst;
if not DirectoryExists(dbpath) then
begin
MyWriteln('ОШИБКА! Путь до базы данных Oracle не найден!');
readln;
Exit;
end;
MyWrite('Имя базы данных ['+dbname+']: ');
readln(readst);
if (readst<>'') then dbname:=readst;
MyWrite('Пароль пользователя SYS ['+dbpass+']: ');
readln(readst);
if (readst<>'') then dbpass:=readst;
MyWrite('Подключаемся к базе данных... ');
Conn := TSQLConnection.Create(nil);
Query := TSQLQuery.Create(nil);
try
try
Conn.ConnectionName:='OracleConnection';
Conn.DriverName := 'Oracle';
Conn.GetDriverFunc:='getSQLDriverORACLE';
Conn.LibraryName:='dbxora30.dll';
Conn.VendorLib:='OCI.DLL';
Conn.Params.Clear;
Conn.Params.Add('DataBase='+dbname);
Conn.Params.Add('User_Name=sys');
Conn.Params.Add('Password='+dbpass);
Conn.LoginPrompt:=false;
Conn.Connected:=true;
Query.SQLConnection := Conn;
Query.SQL.Text := 'SELECT banner FROM v$version';
Query.Open;
while not Query.Eof do begin
Writeln(Query.Fields[0].AsString);
Query.Next;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
Query.Free;
Conn.Free;
end;
readln; //КОНЭЦ
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.