PDA

Ver la Versión Completa : grant a nivel de campo


mRoman
12-12-2013, 23:49:06
Hola amigos....

Fijense q estoy trabajando con Firebird 2.0 y quisiera saber si esta sentencia la soporta la version de firebird que uso:

grant update (campo, campo, campo) on tabla to user


Lo anterior lo consulte en este foro, pero para Oracle....

De antemano les comento que hice algunas pruebas en un usuario que tenia asignado el privilegio UPDATE para todos los campos, pero necesito que algunos no los pueda modificar.

Para esto le quite el privilegio UPDATE al usuario, luego ejecute la instruccion:


grant update (CAMPO1, CAMPO2, CAMPO3) on MI_TABLA to EL_USUARIO


Pero la aplicación me envía un mensaje diciendome que el data set no puede realizar UPDATE...o algo asi. El caso es que el grant por campo (columna) no lo esta realizando...me hara falta algo mas ???

Alguien me puede ayudar en esto?. GRACIAS !!!

ecfisa
13-12-2013, 01:30:20
Hola mRoman.

Un script de ejemplo que crea el usuario "PEREZ", le da derechos de lectura, inserción y modificación sólo sobre el campo "FECHA" en la tabla "TABLA":

CREATE USER PEREZ PASSWORD '123';
ALTER USER PEREZ FIRSTNAME 'JUAN' MIDDLENAME 'M.' LASTNAME 'PEREZ';
GRANT SELECT, INSERT, UPDATE(FECHA) ON TABLA TO PEREZ;


Saludos :)

mRoman
13-12-2013, 01:46:09
Ok...agradezco tu ejemplo ecfisa. Estoy haciendo los mismo....pero como que algo no funciona bien, porque me sale un error. En fin probaré tu ejemplo. Por cierto que version de firebird usas?....

mRoman
13-12-2013, 01:54:18
Apartir de que version de Firebird se pueden ejecutar ese tipo de sentencias SQL ecfisa?

ecfisa
13-12-2013, 04:20:47
Hola mRoman.
Apartir de que version de Firebird se pueden ejecutar ese tipo de sentencias SQL ecfisa?
Te pido perdón por la confusión, leí mal. Ahora me percato que en el mensaje #1 mencionas que trabajas la versión 2.0 no la 2.5... :o

La sintáxis del ejemplo corresponde a la versión 2.5

Saludos :)

mRoman
13-12-2013, 06:20:30
Te agradezco ecfisa que te hayas fijado.

Fijate que a pesar de que tengo la version 2.0 la sentencia se ejecuta y no marca error, pero obviamente no realiza lo que quiero.....probaré con la versión 2.5

Saludos

ecfisa
13-12-2013, 07:44:39
Hola mRoman.

También podes crear roles, darles privilegios y luego asignárselo a uno o mas usuarios. Todos los usuarios pertenecientes al mismo rol, heredan los privilegios del mismo.

Ejemplo:

CREATE ROLE CAJEROS;
GRANT SELECT, INSERT, DELETE, UPDATE(CODIGO, CANTIDAD) ON VENTAS TO CAJEROS;


Luego:

CREATE USER PEREZ PASSWORD '123';
ALTER USER PEREZ FIRSTNAME 'JUAN' MIDDLENAME 'M.' LASTNAME 'PEREZ';
GRANT CAJEROS TO PEREZ;

CREATE USER DITULIO PASSWORD '123';
ALTER USER DITULIO FIRSTNAME 'GUSTAVO' MIDDLENAME 'ANTONIO' LASTNAME 'DITULIO';
GRANT CAJEROS TO DITULIO;
...


Saludos :)

mRoman
13-12-2013, 19:08:25
Gracias ecfisa.

Probe con la versión 2.5 y no hace lo que quiero. Mejor explico el "ambiente" en el cual estoy trabajando (Creo que por aqui debí haber empezado):

Tengo un DATASET ligado a un DbGRID, aqui tengo algunas columnas habilitadas y otras no, pero es aqui donde NO QUIERO que el usuario modifque el campo en cuestion.

Ejecuto la siguiente sentencia SQL en el ScripExecutive del IbExpert:

grant update (campo1,campo3,campoN) on TABLA to USUARIO

(Omito el "campo2", porque ese quiero que NO tenga el privilegio UpDate)

Lo ejecuto y NO me marca ningún error....

Me voy a la aplicación, y trato de modificar en el DbGrid en el campo, pero al momento que habro el DataSet (DataSet1.Open), me envia el siguiente mensaje:

Project MI_EJECUTABLE.exe raised exception class EIBInterBaseRoleError with message 'no permission for update/write access to COLUMN MI_TABLA.MI_CAMPO'. Proccess stoped. Use step or Run to continue

El mensaje anterior me lo envia desde Delphi, porque ejecuto desde ahi la aplicación....y este otro mensaje ejecutando directamente desde el EXE:


Project MI_EJECUTABLE.exe raised exception class EIBClientError with message 'Cannot update. (No update query)'. Proccess stopped. Use step or Run to continue

En otras palabras, parece ser que TODA la tabla no la puedo modificar !!!....y de hecho si, no puedo modificar otras columnas del grid, que obviamente están habilitadas para ser modificadas directamente....

Creen que hace falta algo ?.....

Saludos.

ecfisa
13-12-2013, 20:09:01
Hola mRoman.

En este caso el problema no lo ocasiona Firebird sino el componente, que cuando aplica el update lo hace sobre todo el registro. De ese modo incluye aquellos campos sobre los que el usuario no posee el privilegio de la acción y de allí que se eleva la excepción.

Saludos :)

ecfisa
13-12-2013, 20:37:36
Hola de nuevo.

Para demostrar con un ejemplo lo que te menciono arriba, supongamos una hipotética tabla:

CREATE TABLE VENTAS (
ID INTEGER,
PRODUCTO VARCHAR(30),
CANTIDAD INTEGER,
PRECIO NUMERIC(18, 6),
FECHA DATE,
FECHAHORA TIMESTAMP
);

y que el excelente y nunca bién ponderado empleado "PEREZ", ha iniciado sesión con estos privilegios:

GRANT SELECT, INSERT, UPDATE(CANTIDAD) ON VENTAS TO PEREZ;


Si ejecuta esta consulta:

...
begin
with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE VENTAS SET CANTIDAD = :PCANT');
SQL.Add('WHERE ID = 1'); // una condición de ejemplo
IBQuery1.ParamByName('PCANT').AsInteger := StrToInt(Edit1.text);
ExecSQL;
end;
end;

No va a tener ningun problema.

pero si intenta hacer:

...
begin
with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE VENTAS SET PRECIO = :PPREC');
SQL.Add('WHERE ID = 1'); // una condición de ejemplo
IBQuery1.ParamByName('PPREC').AsCurrency:= StrToFloat(Edit1.text);
ExecSQL;
end;
end;

va a obtener un bonito mensaje: "No permission for update/write access to column VENTAS.PRECIO"

Saludos :)

mRoman
18-12-2013, 05:50:14
Gracias ecfisa por tus respuestas y una disculpa por no haber contestado antes tus post.

Me queda claro con tus ejemplos lo que esta pasando. Entonces quiere decir que si a tu primer query (el cual lo reescribo nuevamente), le agrego el campo de PRECIO....que pasaria?

Si ejecuta esta consulta:

...
begin
with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE VENTAS SET CANTIDAD = :PCANT, PRECIO = :PPREC');
SQL.Add('WHERE ID = 1'); // una condición de ejemplo
IBQuery1.ParamByName('PCANT').AsInteger := StrToInt(Edit1.text);
IBQuery1.ParamByName('PPREC').AsInteger:=StrToInt(Edit2.text);
ExecSQL;
end;
end;



AHORA SI HABRÁ PROBLEMA!?...QUE OTRA SOLUCION PUDIERA EXISTIR....un componente IBQuery por cada campo?....ups....