Hola mRoman.
Cita:
Existe alguna diferencia entre "commit" y "commitretainig" para este caso?
|
No, no en este caso. Utilicé
CommitRetaining para reducir el código, pero se podría hacer con
Commit sin ningún problema.
A ver si podemos echarle mas luz al asunto con algunos ejemplos simples.
Las acciones a tomar son:
- Crear un rol
- Darle privilegios
- Crear un usuario
- Asignarle el rol
Script ejemplo:
Código SQL
[-]
CREATE ROLE ROLCLIENTE;
GRANT SELECT ON HORARIOS TO ROLCLIENTE;
CREATE USER PEPE PASSWORD '1234' FIRSTNAME 'JOSE' MIDDLENAME 'APOLONIO' LASTNAME 'PEREZ';
GRANT ROLCLIENTE TO PEPE;
Desde Delphi:
Código Delphi
[-]
with IBSQL1 do
begin
Close;
SQL.Text := 'CREATE ROLE ROLCLIENTE';
ExecQuery;
IBTransaction1.CommitRetaining;
Close;
SQL.Text := 'GRANT SELECT ON HORARIOS TO ROLCLIENTE';
ExecQuery;
IBTransaction1.CommitRetaining;
SQL.Text := 'CREATE USER PEPE PASSWORD ''1234'' FIRSTNAME ''JOSE'''+
'MIDDLENAME ''APOLONIO'' LASTNAME ''PEREZ''';
ExecQuery;
IBTransaction1.CommitRetaining;
Close;
SQL.Text := 'GRANT ROLCLIENTE TO PEPE';
ExecQuery;
IBTransaction1.CommitRetaining;
end;
Luego de creado, como siempre antes de abrir el
TIBDatabase debes contar con el nombre, la contraseña del usuario... Y ahora también el nombre del rol para pasarlo como parámetro con los anteriores.
Y seguramente me vas a preguntar: ¿ De donde saco la lista de roles del candidato para mostrarlos y que pueda elegir con cuál entra ?
Un ejemplo:
Código Delphi
[-]
...
procedure TForm1.GetUsrRoles(const UserName: string; TS: TStrings);
begin
with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT RDB$RELATION_NAME AS ROLNAME');
SQL.Add('FROM RDB$USER_PRIVILEGES');
SQL.Add('WHERE RDB$PRIVILEGE = ''M'' AND RDB$USER = :PNAME');
ParamByName('PNAME').AsString:= UserName;
Open;
while not Eof do
begin
TS.Add(FieldByName('ROLNAME').AsString);
Next
end;
Close
end;
end;
procedure TForm1.EditNombreExit(Sender: TObject);
begin
GetUsrRoles(EditNombre.Text,ComboBox1.Items);
end;
...
Si el usuario
PEPE tiene asignado mas de un rol, los privilegios que adquirirá, se corresponderán con el rol que haya elegido previamente a conectarse:
Código Delphi
[-]
begin
with IBDatabase1 do
begin
Close;
DatabaseName := 'SERVER:C\Carpeta\SubCarpeta\BaseDatos.FDB';
LoginPrompt:= False;
Params.Clear;
Params.Add('user_name=' + EditNombre.Text);
Params.Add('password=' + EditPassword.Text);
Params.Add('sql_role_name=' + ComboBox1.Text);
try
Open;
except
on E: Exception do
begin
MessageDlg(E.Message, mtError, [mbOk], 0);
raise
end
end
end;
Saludos.