Bueno, después de luchar y luchar contra la corriente logré hacerlo.
Una ventana donde puedo dar de alta, baja y modificar los datos del Usuario. Desde Delphi.
Otra ventana donde puedo asignar los Roles a esos Usuarios, y quitarlos si es necesario.
Pongo a disposición el código, y una imagen (si se me permite) que grafica lo que digo. Mil gracias a todos los que ayudaron con sus comentarios y aportes.
Código Delphi
[-]
procedure Roles(qryRoles:TFDQuery);
begin
with qryRoles do
begin
Close;
sql.Clear;
sql.Add('Select r.rdb$role_name ');
sql.Add('From rdb$roles r');
try
Open();
except
raise;
end;
end;
end;
procedure UsuariosxRoles(qryUsuariosxRoles:TFDQuery);
begin
with qryUsuariosxRoles do
begin
close;
sql.clear;
sql.add('Select r.rdb$user, r.RDB$RELATION_NAME as grupos ');
sql.Add('From RDB$USER_PRIVILEGES r ');
sql.Add('Where r.RDB$PRIVILEGE = ''M'' ');
sql.Add('Order by 1 asc, 2 asc ');
try
Open;
except
raise;
end; end; end;
procedure PermitirRol(usuario:string; rol:string; grantOption:boolean;
qRoles:TFDQuery);
var
sentencia:string;
begin
sentencia := 'Grant ' + rol + ' to ' + usuario;
if grantOption then
sentencia := sentencia + ' with admin option';
with qRoles do
begin
close;
sql.Clear;
sql.add(sentencia);
try
ExecSQL;
except
raise;
end;
end; end;
procedure QuitarRol(usuario:string; rol:string; qRoles:TFDQuery);
var
sentencia:string;
begin
sentencia := 'Revoke ' + rol + ' from ' + usuario;
with qRoles do
begin
close;
sql.Clear;
sql.add(sentencia);
try
ExecSQL;
except
raise;
end;
end; end;
procedure TfrmRolesxUsuarios.btnGrantedClick(Sender: TObject);
var
NombreUsuario, NombreRol:string;
begin
if (memUsuarios.RecNo > 0) and (grdRoles.SelectedRow >= 0)
and (IDYES = Application.MessageBox('¿Confirma nueva Relación?.',
PWideChar(Self.Caption), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2)) then
begin
NombreUsuario:=memUsuarios.FieldByName('UserName').AsString;
NombreRol:=grdRoles.CellByName['clRoles', grdRoles.SelectedRow].AsString;
with DataModule1 do
begin
terminarTransaccion;
transaccion.StartTransaction;
try
PermitirRol(NombreUsuario, NombreRol, False, qRoles);
UsuariosxRoles(qRoles);
transaccion.CommitRetaining;
LimpiarNextGrid(grdUsuariosxRoles);
CargarNextGrid(grdUsuariosxRoles, qRoles);
transaccion.Commit;
except
on e:Exception do
begin
terminarTransaccion;
mErrores(e, 'Operación solicitada falló...', self.Caption);
end;
end;
end;
end
else
begin
Application.MessageBox('Debe seleccionar un Usuario y un Rol',
PWideChar(self.Caption), MB_OK + MB_ICONERROR);
end;
end;
procedure TfrmRolesxUsuarios.btnRevokeClick(Sender: TObject);
var
NombreUsuario, NombreRol:string;
begin
if (grdUsuariosxRoles.SelectedRow >= 0)
and (IDYES = Application.MessageBox('¿Confirma eliminación de la Relación?.'
+ #13#10 + 'Esta operación no podrá deshacerse.',
PWideChar(Self.Caption), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2)) then
begin
NombreUsuario:=grdUsuariosxRoles.CellByName['clUsuarioRxU', grdUsuariosxRoles.SelectedRow].AsString;
NombreRol:=grdUsuariosxRoles.CellByName['clRolRxU', grdUsuariosxRoles.SelectedRow].AsString;
with DataModule1 do
begin
terminarTransaccion;
transaccion.StartTransaction;
try
QuitarRol(NombreUsuario, NombreRol, qRoles);
UsuariosxRoles(qRoles);
transaccion.CommitRetaining;
LimpiarNextGrid(grdUsuariosxRoles);
CargarNextGrid(grdUsuariosxRoles, qRoles);
transaccion.Commit;
except
on e:Exception do
begin
terminarTransaccion;
mErrores(e, 'Operación solicitada falló...', self.Caption);
end;
end;
end;
end
else
begin
Application.MessageBox('Debe seleccionar un registro de la grilla (Usuario x Rol)',
PWideChar(self.Caption), MB_OK + MB_ICONERROR);
end;
end;
procedure TfrmRolesxUsuarios.btnSalirClick(Sender: TObject);
begin
Close;
end;
procedure TfrmRolesxUsuarios.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
procedure TfrmRolesxUsuarios.Usuarios(SecurityServices:TFDIBSecurity);
begin
with memUsuarios do
begin
Filtered := False;
Filter := 'UserName <> ' + QuotedStr('SYSDBA');
Filtered := True;
try
SecurityServices.DisplayUsers;
memUsuarios.AttachTable(SecurityServices.Users, nil);
memUsuarios.Open;
except
raise;
end;
end;
end;
procedure TfrmRolesxUsuarios.FormShow(Sender: TObject);
begin
with DataModule1 do
begin
terminarTransaccion;
transaccion.StartTransaction;
try
Usuarios(security_services);
Roles(qRoles);
LimpiarNextGrid(grdRoles);
CargarNextGrid(grdRoles, qRoles);
UsuariosxRoles(qRoles);
LimpiarNextGrid(grdUsuariosxRoles);
CargarNextGrid(grdUsuariosxRoles, qRoles);
transaccion.Commit;
except
on e:Exception do
begin
terminarTransaccion;
mErrores(e, 'No se pudieron recuperar los Usuarios.', 'Gestión de Usuarios.');
end;
end;
end;
end;
Herramientas:
DelphiXE5
Firebird 2.5
FireDAC
Mañana agrego un Post con la gestión ABM de los usuarios.
Gracias de nuevo.