Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   ¿Existe un usuario en FB? (https://www.clubdelphi.com/foros/showthread.php?t=92745)

Angel.Matilla 16-01-2018 13:38:35

¿Existe un usuario en FB?
 
¿Cómo puedo comprobar si un usuario está creado en FB? Para crearlo, modificarlo o borrarlo no tengo problema pero no sé como hacer para comprob ar su existencia. He visto en la ayuda de BCB 6 el método DisplayUser pero con este código:
Código:

AnsiString Nombre, cAux;
SecurityService->DisplayUser(Nombre);
cAux = SecurityService->UserInfo[0]->UserName;

al ejecutarse DisplayUSer me da este error:
Cita:

invalid service handle
Evidentemente Nombre es donde está guardado el UserName que estoy buscando ¿Alguna sugerencia?

Angel.Matilla 16-01-2018 13:47:53

:o:o:o
¡No he dicho nada! Se me había olvidado activar SecurityService.

mRoman 19-01-2018 16:25:39

Deberias agregar el codigo completo, para los demas que andamos buscando como hacer eso q tu ya hiciste

Saludos

ecfisa 19-01-2018 19:45:33

Hola.

Para verificar la existencia de un usuario, también se puede consultar a Firebird directamente:
Código PHP:

bool userExists(TIBQuery *QY, const AnsiStringuserName)
{
  
QY->Close();
  
QY->SQL->Clear();
  
QY->SQL->Add("SELECT DISTINCT RDB$USER");
  
QY->SQL->Add("FROM RDB$USER_PRIVILEGES");
  
QY->SQL->Add("WHERE RDB$USER = :USER");
  
QY->ParamByName("USER")->AsString userName;
  
QY->Open();
  
bool found = ! QY->IsEmpty();
  
QY->Close();
  return 
found;
}


// ejemplo del uso
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if ( 
userExists(IBQuery1"sysdba") ) 
     ...


Un ejemplo del uso de TIBSecurityService:
Código PHP:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
TIBSecurityService *ss IBSecurityService1;

  
ss->SecurityAction ActionDisplayUser;
  
ss->LoginPrompt    false;
  
ss->Params->Add("user_name=sysdba");
  
ss->Params->Add("password=masterkey");
  
ss->Active true;
  
__try {
    
ss->DisplayUser(ss->UserName);
    
Memo1->Clear();
    
Memo1->Lines->Add("Name: "+ss->UserInfo[0]->UserName);
    
Memo1->Lines->Add("First Name: "+ss->UserInfo[0]->FirstName);
    
Memo1->Lines->Add("Middle Name: "+ss->UserInfo[0]->MiddleName);
    
Memo1->Lines->Add("Last Name: "+ss->UserInfo[0]->LastName);
    
Memo1->Lines->Add("GroupID: "IntToStr(ss->UserInfo[0]->GroupID));
    
Memo1->Lines->Add("UserID: "+IntToStr(ss->UserInfo[0]->UserID));
  }
  catch (const 
Exceptione) {
    
ShowMessage(e.Message);
  }


Saludos :)

Angel.Matilla 12-09-2020 12:08:14

Estaba corrigiendo un fallo que había en un proyecto en el tema de dar de alta o modificar usuarios y me he encontrado con un problema. Usando el código que me sugirió ecfisa en su día resulta que en la base de datos del proyecto ese usuario no existe (al ejecutar el query no me devuelve nada) pero sí está dado de alta para otras bases de datos que tengo instaladas y me da error

¿Cómo puedo evitar este error?

Casimiro Notevi 12-09-2020 17:19:27

Pues no dando de alta otro repetido :)

Angel.Matilla 14-09-2020 09:26:46

Cita:

Empezado por Casimiro Notevi (Mensaje 538494)
Pues no dando de alta otro repetido :)

¡Muy gracioso! :D

Tenía un error de base en el manejo de FB: Yo suponía que los usuarios se daban de alta en el motor a nivel de cada una de las bases de datos y no a nivel del motor en conjunto. Al final lo he resuelto de la manera más tonta:
Código:

Query->Close();
Query->SQL->Text = "SELECT DISTINCT RDB$USER FROM RDB$USER_PRIVILEGES WHERE RDB$USER = :Nombre";
Query->ParamByName("Nombre")->AsString = Nombre->Text;
Query->Open();

SecurityService->UserName = Nombre->Text;
SecurityService->Password = Clave->Text;
SecurityService->Active = true;
if (Query->IsEmpty())
{
    try
    {
          SecurityService->AddUser();
    }
    catch(Exception &Exc)
    {
          SecurityService->Active = true;
          SecurityService->ModifyUser();
    }
}
else
    SecurityService->ModifyUser();
SecurityService->Active = false;



La franja horaria es GMT +2. Ahora son las 19:23:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi