Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ¿Cómo usar TIBStoredProc? (https://www.clubdelphi.com/foros/showthread.php?t=91740)

Angel.Matilla 11-04-2017 18:49:55

¿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!

ecfisa 11-04-2017 23:13:42

Hola Angel.

Código PHP:

  ...
  
StoredProc->StoredProcName "GRANT_BBDD"// Case sensitive !!
  
... 

Saludos :)

Angel.Matilla 12-04-2017 12:59:01

Gracias. No me había dado cuenta de las mayúsculas.


La franja horaria es GMT +2. Ahora son las 13:31:59.

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