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)
-   -   Problema Seguridad usuarios (https://www.clubdelphi.com/foros/showthread.php?t=86856)

ASAPLTDA 14-10-2014 17:37:56

Problema Seguridad usuarios
 
Buenos dias Foristas
Tengo un problema con firebird 2.1 en windows
Tengo un procedimiento que usa varias tablas las cuales se les ha otorgado seguridad mediante un Role
El role tiene el El procedimiento asignado
A cada usuario tiene el mismo rol asignado

La coneccion a la base de datos usa el mismo role pero cuando ejecuta el procedimiento informa que el usuario no esta autorizado. He borrado el procedimiento y he vuelto a ejecutar la delegación con role y autorización directa al mismo usuario pero sigue sin funcionar.
El mensaje es que el usuario no esta autorizado al procedimiento, o a una tabla los cuales si estan autorizado


Podrian darme una luz de dejo revisar

ASAPLTDA 21-10-2014 06:11:33

Continuo con el problema de seguridad
 
El usuario tiene asignado el role Usuarios
Pero sigue generado el error de usuario invalido, normalmente dice que no tiene autoridad sobre la tabla
DELETE FROM PEDRES_TOT_DESUBICAR_RECURSO_X;
pero otras veces lo da sobre el procedimiento
PEDRES_TOT_DESUBICAR_RECURSO_P1

La realidad estoy muy preocupado no se como encontrar el error, con el usuario SYSDbA funciona perfectamente
espero me den una luz



adjunto Procedimiento
Código SQL [-]
SET TERM ^ ;

create or alter procedure PEDRES_TOT_DESUBICAR_RECURSO_P1 (
    P_CONO CONO,
    P_WHSCOD WHSCOD)
returns (
    MSG varchar(100),
    RECURSO RECURSO,
    WHSLOC WHSLOC,
    QPENDIENTE QPENDIENTE,
    QTYDISTOTAL SALDO,
    QTYDISOTROSNVL SALDO,
    QTYDISNVL1 SALDO,
    QAREASURTIDO SALDO,
    QAREASURTIDOESTIBADA SALDO,
    QBACKORDER SALDO,
    NOESTIBAS NOESTIBAS,
    TIPOREGISTRO TIPOREGISTRO,
    CLFCOD CLFCOD,
    CONO CONO,
    CLIENTE CLIENTE,
    CLIENTESHP CLIENTESHP,
    QRESERVADA QRESERVADA,
    WHSCOD WHSCOD,
    DRECURSO DRECURSO,
    NOPEDIDO NOPEDIDO,
    PEDIDOCLIENTE PEDIDOCLIENTE,
    QTYXESTIBA QTYXESTIBA,
    CONUMERO CONUMERO,
    LOTE LOTE,
    ID ID,
    FECVEN FECVEN,
    W_MENSAJE MENSAJE60)
AS
--    W_QTYPDTEDEMOVER SALDO,
--    W_QAREASURTIDO SALDO,
--    W_QTYMAXAMOVER SALDO,
DECLARE VARIABLE W_QPENDIENTE SALDO = 0;
DECLARE VARIABLE W_QTYDISNETA SALDO = 0;
DECLARE VARIABLE W_QTYDISOTROSNVL SALDO = 0; /* EXISTENCIAS EN NIVELES SUPERIORES AL NIVEL 1 */
DECLARE VARIABLE W_QAREASURTIDO SALDO = 0; /* CANTIDAD REQUERIDA EN AREA DE SURTIDO */
DECLARE VARIABLE W_QASURTIR SALDO = 0;
DECLARE VARIABLE W_NOREGISTROS INTEGER = 0;
DECLARE VARIABLE W_DRECURSO DRECURSO;
DECLARE VARIABLE UNDMED UNDMED;
DECLARE VARIABLE W_UNDMEDUM UNDMED;
DECLARE VARIABLE W_NOESTIBAS NOESTIBAS;
DECLARE VARIABLE W_FLGAPROBADOCXC FLGAPROBADOCXC;
DECLARE VARIABLE W_INTEGER INTEGER;
DECLARE VARIABLE W_UUID UUID;
DECLARE VARIABLE W_ID ID;
DECLARE VARIABLE W_QTYPDTEDEMOVER SALDO;
DECLARE VARIABLE W_QTYMAXAMOVER SALDO;
BEGIN

  DELETE FROM PEDRES_TOT_DESUBICAR_RECURSO_X;
  --mensaje = 'borro archivo';
  --suspend;


/***************************************************************************************************
* PARTE 1 GENERACION  CANTIDAD NETA A DESUBICAR SOLAMENTE PEDIDOS AUTORIZADOS
****************************************************************************************************  */
  TIPOREGISTRO = '0';
  W_ID         = 1;

  FOR SELECT  D.CONO ,
      D.WHSCOD , D.RECURSO , D.CLFCOD ,D.CLIENTE , '' ,
      SUM(D.QPENDIENTE)  
      FROM PEDDET D INNER JOIN PEDMST M ON M.NOPEDIDO = D.NOPEDIDO
      WHERE D.CONO = :P_CONO AND D.WHSCOD = :P_WHSCOD  AND  D.QPENDIENTE > 0
            AND M.FLGAPROBADOCXC = 'S'   -- AND RECURSO = '395016513940'
      GROUP BY D.CONO, D.WHSCOD, D.RECURSO, D.CLFCOD,  D.CLIENTE
            INTO :CONO, :WHSCOD, :RECURSO, :CLFCOD, :CLIENTE, :CLIENTESHP, :QPENDIENTE
      DO BEGIN
        W_NOREGISTROS= W_NOREGISTROS +1;
        QTYDISNVL1    =0;
        QTYDISOTROSNVL=0;
        QTYDISTOTAL   =0;
        QBACKORDER    =0;
        NOESTIBAS     =0;

        -- DATOS MAESTRO DE PRODUCTO NUMERO DE PRODUCTOS POR ESTIBA
         SELECT COALESCE(QTYXESTIBA,1), DRECURSO, UNDMED FROM RESMST WHERE RECURSO = :RECURSO
                 INTO :QTYXESTIBA, :DRECURSO, :UNDMED;
         IF (QTYXESTIBA<=0) THEN
             QTYXESTIBA=1;

        -- SUSPEND;

         -- LEER SALDO DE INVENTARIOS
         SELECT  COALESCE(SUM(CASE WHEN WHSNVL=1 THEN QTYDIS ELSE 0 END),0), COALESCE( SUM(QTYDIS),0)  FROM INSALDO S
           INNER JOIN WHSLOC L ON L.WHSLOC = S.WHSLOC AND L.WHSCOD = S.WHSCOD
           WHERE S.RECURSO = :RECURSO AND S.CLFCOD = :CLFCOD AND S.CLIENTE=:CLIENTE AND S.WHSCOD = :WHSCOD
           INTO :QTYDISNVL1, :QTYDISTOTAL;

        -- SUSPEND;

         CONO   = P_CONO ;
         WHSCOD = P_WHSCOD;

         W_QTYDISNETA   = QTYDISTOTAL - QTYDISNVL1;
         QTYDISOTROSNVL = QTYDISTOTAL - QTYDISNVL1;
         W_QPENDIENTE   = QPENDIENTE;
         QAREASURTIDO   = 0;



         -- LA CANTIDAD A MOVER ES LA QORDENADA - EXISTENCIA EN EL NIVEL 1
         W_QPENDIENTE = W_QPENDIENTE - QTYDISNVL1;
         

         -- NO SE REQUIERE RESURTIR AREA RESURTIDO TIENE EXISTECIAS
         IF (W_QPENDIENTE <= 0  )  THEN  BEGIN
             W_QPENDIENTE  = 0;
             QAREASURTIDO  = 0;
         END

         /*  */

         IF (W_QPENDIENTE > 0) THEN BEGIN
            IF (W_QPENDIENTE <= W_QTYDISNETA) THEN BEGIN
               QAREASURTIDO = QAREASURTIDO + W_QPENDIENTE;
               W_QPENDIENTE = 0;
            END
            ELSE BEGIN
                QAREASURTIDO = QAREASURTIDO + W_QTYDISNETA;
                QBACKORDER  =  W_QPENDIENTE - W_QTYDISNETA;
                W_QPENDIENTE = 0;
            END
         END

         /* AJUSTAR POR CANTIDAD ESTIBA */
         QAREASURTIDOESTIBADA =0;
         NOESTIBAS=0;
         W_QTYMAXAMOVER = QAREASURTIDO; -- CANTIDAD A MOVER A AREA
         WHILE  (W_QTYMAXAMOVER > 0) DO BEGIN
                 NOESTIBAS = NOESTIBAS+1;
                 W_QTYMAXAMOVER = W_QTYMAXAMOVER - QTYXESTIBA;
         END
                
         W_QTYMAXAMOVER = NOESTIBAS * QTYXESTIBA;   -- CANTIDAD A MOVER POR ESTIBAS
         IF (W_QTYMAXAMOVER > QTYDISOTROSNVL) THEN
            QAREASURTIDOESTIBADA  = QTYDISOTROSNVL;
         ELSE
            QAREASURTIDOESTIBADA = W_QTYMAXAMOVER;

      /* GRABAR */
       SELECT P_UUID FROM UUID_TOCHAR INTO :W_UUID;
       W_ID = W_ID + 1;
      INSERT INTO PEDRES_TOT_DESUBICAR_RECURSO_X(UUID,
             RECURSO, CLFCOD, WHSLOC, QTYDISTOTAL, QPENDIENTE, QTYDISOTROSNVL, QTYDISNVL1, QAREASURTIDO, QBACKORDER, NOESTIBAS,
             TIPOREGISTRO, CONO, CLIENTE, CLIENTESHP, QRESERVADA, WHSCOD, NOPEDIDO, PEDIDOCLIENTE, QTYXESTIBA, ID,
             QAREASURTIDOESTIBADA, DRECURSO, UNDMED) VALUES
             (:W_UUID, :RECURSO, :CLFCOD, :WHSLOC, :QTYDISTOTAL, :QPENDIENTE, :QTYDISOTROSNVL, :QTYDISNVL1, :QAREASURTIDO,
             :QBACKORDER, :NOESTIBAS,
             :TIPOREGISTRO, :CONO, :CLIENTE, :CLIENTESHP, :QRESERVADA, :WHSCOD, :NOPEDIDO, :PEDIDOCLIENTE,
              :QTYXESTIBA, :W_ID, :QAREASURTIDOESTIBADA, :DRECURSO, :UNDMED);

        
END



/*-----------------------------------------------------------------------------------------------------
* PARTE 2 GENERACION UBICACIONES A DESCARGAR  BASE DE LECTURA ARCHIVO PARTE1
----------------------------------------------------------------------------------------------------- */

  TIPOREGISTRO = '1';


  FOR SELECT CONO, CLIENTE, WHSCOD, RECURSO, CLFCOD, QAREASURTIDO, QTYXESTIBA, DRECURSO, UNDMED
      FROM PEDRES_TOT_DESUBICAR_RECURSO_X R
      WHERE TIPOREGISTRO = '0' AND QAREASURTIDO > 0
      INTO  :CONO, :CLIENTE, :WHSCOD, :RECURSO, :CLFCOD, :QAREASURTIDO, :QTYXESTIBA,
            :DRECURSO, :UNDMED
      DO BEGIN

      W_QTYPDTEDEMOVER = QAREASURTIDO;

      -- BUSCAR UBICACIONES SUPERIOR AL NIVEL 1
      FOR SELECT S.WHSLOC, S.QTYDIS, S.CONUMERO
      --, S.LOTE, Z.FECVEN
      FROM INSALDO S
            INNER JOIN WHSLOC L ON L.WHSLOC = S.WHSLOC AND L.WHSCOD = S.WHSCOD AND L.WHSNVL > 1
           -- LEFT OUTER JOIN INLOTES Z ON Z.LOTE = S.LOTE AND Z.RECURSO = S.RECURSO
            WHERE S.RECURSO = :RECURSO AND S.CLFCOD = :CLFCOD AND S.WHSCOD = :WHSCOD AND S.CONO = S.CONO AND S.CLIENTE = :CLIENTE
                  AND S.QTYDIS > 0
            ORDER BY
            -- Z.FECVEN,
            S.QTYDIS, S.CONUMERO, S.WHSLOC
            INTO :WHSLOC, :W_QTYDISOTROSNVL, :CONUMERO
            --, :LOTE, :FECVEN
            DO BEGIN

            W_QASURTIR  = 0;
            NOESTIBAS = 0;
            QTYDISTOTAL = W_QTYDISOTROSNVL;
            QAREASURTIDOESTIBADA =0;




--             SALDO < REQUERIDO
            IF (W_QTYDISOTROSNVL <= W_QTYPDTEDEMOVER ) THEN BEGIN
                W_QASURTIR        =  W_QTYDISOTROSNVL;
                W_QTYPDTEDEMOVER  =  W_QTYPDTEDEMOVER - W_QASURTIR;
            END
            ELSE BEGIN
                W_QTYMAXAMOVER = W_QTYPDTEDEMOVER; 
                WHILE  (W_QTYMAXAMOVER > 0 ) DO BEGIN
                     NOESTIBAS      = NOESTIBAS+1;
                     W_QTYMAXAMOVER = W_QTYMAXAMOVER - QTYXESTIBA;
                  END

                  W_QTYMAXAMOVER = NOESTIBAS * QTYXESTIBA;   -- CANTIDAD A MOVER POR ESTIBAS
                  IF (W_QTYMAXAMOVER > W_QTYDISOTROSNVL) THEN
                     QAREASURTIDOESTIBADA  = W_QTYDISOTROSNVL;
                  ELSE
                   QAREASURTIDOESTIBADA = W_QTYMAXAMOVER;

                   
                  W_QASURTIR     = QAREASURTIDOESTIBADA;
                  W_QTYPDTEDEMOVER =  W_QTYPDTEDEMOVER -  W_QASURTIR;
             END
           --**********************************

-- SUSPEND;
       /* EXISTE CANTIDAD A SURTIR GRABE EL REGISTRO */
               IF (W_QASURTIR > 0 ) THEN BEGIN
                    SELECT P_UUID FROM UUID_TOCHAR INTO :W_UUID;
                    W_ID = W_ID + 1;
                   INSERT INTO PEDRES_TOT_DESUBICAR_RECURSO_X(UUID, 
                       RECURSO, CLFCOD, WHSLOC, QAREASURTIDO, QTYDISTOTAL,
                       TIPOREGISTRO, CONO, CLIENTE, WHSCOD, QTYXESTIBA, NOESTIBAS, CONUMERO, QPENDIENTE, ID
                       , DRECURSO, UNDMED) VALUES
                       (:W_UUID, :RECURSO, :CLFCOD, :WHSLOC, :W_QASURTIR, :QTYDISTOTAL,
                      :TIPOREGISTRO, :CONO, :CLIENTE, :WHSCOD, :QTYXESTIBA, :W_NOESTIBAS, :CONUMERO, :W_QTYPDTEDEMOVER, :W_ID,
                      :DRECURSO, :UNDMED);
               END



               -- DEJAR DE LEER SALDO INVENTARIOS
              IF (W_QTYPDTEDEMOVER=0) THEN LEAVE ;


     
    END     -- FINLECTURA DE INSALDO

    
  END


--EXIT; -- *** QUITAR **********


/***************************************************************************************************
* PARTE  RETORNAR DATOS GENERADOS
****************************************************************************************************  */


  FOR SELECT  RECURSO, CLFCOD, WHSLOC, QTYDISTOTAL, QPENDIENTE, QTYDISNVL1, QAREASURTIDO, QBACKORDER, NOESTIBAS, TIPOREGISTRO, CONO,
       CLIENTE, CLIENTESHP, QRESERVADA, WHSCOD, NOPEDIDO, PEDIDOCLIENTE, QTYXESTIBA, CONUMERO, LOTE, UUID, ID, QTYDISOTROSNVL, QAREASURTIDOESTIBADA,
       DRECURSO
       FROM PEDRES_TOT_DESUBICAR_RECURSO_X ORDER BY
       RECURSO,  TIPOREGISTRO,   ID INTO
       :RECURSO, :CLFCOD, :WHSLOC, :QTYDISTOTAL, :QPENDIENTE, :QTYDISNVL1, :QAREASURTIDO, :QBACKORDER, :NOESTIBAS, :TIPOREGISTRO, :CONO,
       :CLIENTE, :CLIENTESHP, :QRESERVADA, :WHSCOD, :NOPEDIDO, :PEDIDOCLIENTE, :QTYXESTIBA , :CONUMERO, :LOTE,  :W_UUID, :ID, :QTYDISOTROSNVL, :QAREASURTIDOESTIBADA,
       :DRECURSO
       DO BEGIN
         SUSPEND;
       END



/* FIN PRCEDURE */
END^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,INSERT,DELETE ON PEDRES_TOT_DESUBICAR_RECURSO_X TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT SELECT ON PEDDET TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT SELECT ON PEDMST TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT SELECT ON RESMST TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT SELECT ON INSALDO TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT SELECT ON WHSLOC TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT EXECUTE ON PROCEDURE UUID_TOCHAR TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1 TO SYSDBA;
GRANT EXECUTE ON PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1 TO USUARIOS;

ASAPLTDA 24-10-2014 04:04:13

Posible Bug firebird 2.1 Por numero de caracteres objectos de 31 caracteres
 
El problema de seguridad fue solucionado cambiando el nombre del archivo que tenia un nombre parecido al procedimiento

GRANT SELECT,INSERT,DELETE ON PEDRES_TOT_DESUBICAR_RECURSO_X TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;
GRANT SELECT ON PEDDET TO PROCEDURE PEDRES_TOT_DESUBICAR_RECURSO_P1;

PROCEDURE: PEDRES_TOT_DESUBICAR_RECURSO_P1 = 31 CARACTERES !!!:-|!!!:-|
TABLA : PEDRES_TOT_DESUBICAR_RECURSO_X = 31 CARECTERES
se cambio el nombre de la tabla a: PEDRES_WRK_DESUBICAR_RECURSO_X y se soluciono el problema, con este problema donde firebird emite un error que no existe recomiento evitar usar nombres muy largos

Casimiro Notevi 24-10-2014 09:57:49

Es que está limitado a 32 caracteres máximo, lo pone en el manual :)
Creo que hay una opción de configuración para cambiarlo, pero nunca la he usado, me parece que 32 caracteres es una longitud excesiva y siempre uso muchos menos.

Por cierto, se te olvidó usar las etiquetas para el código, vas a tener que cumplir una penitencia :p

ASAPLTDA 25-10-2014 18:29:50

Nombres Largos
 
Gracias Casimiro, revise mel punto de longitud a ver que encuentro, sobre la penitencia lo meresco, pero despues de gastar como 10 dias en el problema que no fue posible hallar el problema documentado se me olvido :D


La franja horaria es GMT +2. Ahora son las 00:38:49.

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