Ver Mensaje Individual
  #1  
Antiguo 11-04-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
¿Cómo usar TIBStoredProc?

Sé que puede parecer una pregunta de 1º de Borland, pero se me resiste y no sé por qué. Creo un procedimiento por código para dar privilegios a los usuarios de una base de datos así (el código lo he cogido de un blog):
Código:
CREATE PROCEDURE
  Grant_BBDD(iUsuario VARCHAR(15)) 
  AS 
  DECLARE VARIABLE pObjeto VARCHAR(35);
BEGIN
    -- Se otorga derechos sobre las tablas y sobre las vistas

    FOR SELECT RDB$RELATION_NAME
    FROM RDB$RELATIONS
    WHERE RDB$SYSTEM_FLAG = 0
    INTO :pObjeto
    DO
      EXECUTE STATEMENT 'GRANT ALL ON ' || pObjeto ||
      ' TO ' || iUsuario;

    -- Se otorga derechos sobre los stored procedures

    FOR SELECT RDB$PROCEDURE_NAME
    FROM RDB$PROCEDURES
    WHERE RDB$SYSTEM_FLAG = 0
    INTO :pObjeto
    DO
      EXECUTE STATEMENT 'GRANT EXECUTE ON PROCEDURE ' || pObjeto ||
      ' TO ' || iUsuario;
END
Con IBManager compruebo que efectivamente se crea


y en el formulario donde está definido están indicadas las propiedades


A partir de una tabla Paradox creo los usuarios en la nueva base de datos en Firebird (tTabla es un TTable y el resto de elementos están definidos y enlazados; QuitaAcento es una función definida para eso):
Código:
tTabla->Close();
tTabla->TableName = AnsiString(cTablasAnt) + "\\Users.db";
tTabla->Filter    = "";
tTabla->Filtered  = false;
tTabla->Open();

StoredProc->Close();     // Asignamos el procedimiento
StoredProc->StoredProcName = "Grant_BBDD";
     
slIniFile->Clear();
for (; !tTabla->Eof; tTabla->Next())
{
     Query->Close();     // Creamos el ususario en la BB.DD. de la aplicación
     Query->SQL->Text = "INSERT INTO Usuarios (Nombre, Administrador, Fondo, Papel, Tinta) VALUES (:Nombre, :Administrador, :Fondo, :Papel, :Tinta)";
     Query->ParamByName("Nombre")->AsString         = QuitaAcento(UpperCase(tTabla->FieldByName("Nombre")->AsString));
     Query->ParamByName("Administrador")->AsInteger = tTabla->FieldByName("Admin")->AsString == "S" ? 1 : 0;
     Query->ParamByName("Fondo")->AsInteger         = tTabla->FieldByName("Fondo")->AsInteger;
     Query->ParamByName("Papel")->AsInteger         = tTabla->FieldByName("Papel")->AsInteger;
     Query->ParamByName("Tinta")->AsInteger         = tTabla->FieldByName("Tinta")->AsInteger;
     try
     {
          Query->ExecSQL();
          Query->Transaction->Commit();
          slIniFile->Add(QuitaAcento(UpperCase(tTabla->FieldByName("Nombre")->AsString)));
     }
     catch(...)
     {
          Screen->Cursor = crArrow;
          Query->Transaction->Rollback();
          return false;
     }

     Query->Close();     // Grabamos el valor de la clave en la tabla de claves
     Query->SQL->Text = "INSERT INTO Claves (Nombre, Clave, Fecha, Caduca) VALUES (:Nombre, :Clave, :Fecha, :Caduca)";
     Query->ParamByName("Nombre")->AsString   = QuitaAcento(UpperCase(tTabla->FieldByName("Nombre")->AsString));
     Query->ParamByName("Clave")->AsString    = tTabla->FieldByName("Clave")->AsString;
     Query->ParamByName("Fecha")->AsDateTime  = Date();
     Query->ParamByName("Caduca")->AsDateTime = IncMonth(Date(), 2);
     try
     {
          Query->ExecSQL();
          Query->Transaction->Commit();
     }
     catch(...)
     {
          Screen->Cursor = crArrow;
          Query->Transaction->Rollback();
          return false;
     }

     Query->Close();     // Creamos el usuario en la BB.DD. Firebird
     Query->SQL->Text = "CREATE USER " + QuitaAcento(UpperCase(tTabla->FieldByName("Nombre")->AsString)) + " PASSWORD '" +
                                  QuitaAcento(tTabla->FieldByName("Clave")->AsString) + "'";
     try
     {
          Query->ExecSQL();
          Query->Transaction->Commit();
     }
     catch(...)
     {
          Screen->Cursor = crArrow;
          Query->Transaction->Rollback();
          for (nItem = 0; nItem < slIniFile->Count; nItem ++)
          {
               Query->Close();
               Query->SQL->Text = "DROP USER " + slIniFile->Strings[nItem];
               try
               {
                    Query->ExecSQL();
                    Query->Transaction->Commit();
               }
               catch(...)
               {
               }
          }
          return false;
     }

     StoredProc->Close();     // Concedemos privilegios de uso
     StoredProc->ParamByName("iUsuario")->AsString = QuitaAcento(UpperCase(tTabla->FieldByName("Nombre")->AsString));
     StoredProc->ExecProc();
}
Se ejecuta toto el código bien pero al llegar a esas tres últimas líneas me da un error:
Cita:
Dynamic SQL Error
SQL error code = -204
Procedur unknow
Grant_BBDD
lo cual me tiene muy perplejo porque ¡lo estoy viendo con IBManager!
Responder Con Cita