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!