Ver Mensaje Individual
  #7  
Antiguo 10-12-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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;

// Ejemplo de llamada
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 10-12-2012 a las 08:24:01. Razón: identación
Responder Con Cita