Ajuda com trigger de verificação

SQL

Oracle

Banco de Dados

Oracle PL SQL

Lógica de programação

18/12/2018

Estou criando uma trigger para validar que quando o usuário logado seja de uma empresa ele só possa utilizar veículos dessa empresa e caso tente utilizar veículo da outra empresa ele apresente a mensagem de erro,. Mas não consigo fazer funcionar, ele sempre dá o retorno vazio "dados não encontrados", alguém poderia me ajudar?

CREATE OR REPLACE TRIGGER "AD_TGFVIAG_IUP_REGRAS"
BEFORE INSERT OR UPDATE ON TGFVIAG
FOR EACH ROW
BEGIN

  
DECLARE
  
   P_CODEMP1   INT;
   P_CODEMP3   INT;
   P_USUEMP    INT;
  
  BEGIN
  
       
    
    /* Empresa do usuario */
    SELECT TSIUSU.CODEMP 
    INTO P_USUEMP  
    FROM TSIUSU 
    WHERE TSIUSU.CODUSU = STP_GET_CODUSULOGADO();
    
 /* Busca o CODINSTPRINC e grava na variavel de empresa 3 */
    IF P_USUEMP = 3 THEN
    SELECT AD_TGFVEIEMP.CODEMP
    INTO P_CODEMP3
    FROM TGFVEI, AD_TGFVEIEMP
    WHERE TGFVEI.CODVEICULO = AD_TGFVEIEMP.CODVEICULO
    AND AD_TGFVEIEMP.CODEMP = 3
    AND TGFVEI.CODVEICULO = :NEW.CODVEIPRIN;
    
    
END IF;     

/* Busca o CODINSTPRINC e grava na variavel de empresa 3 */
     IF P_USUEMP = 1 THEN                                                       
     SELECT AD_TGFVEIEMP.CODEMP
    INTO P_CODEMP1
    FROM TGFVEI, AD_TGFVEIEMP
    WHERE TGFVEI.CODVEICULO = AD_TGFVEIEMP.CODVEICULO
    AND AD_TGFVEIEMP.CODEMP = 1
    AND TGFVEI.CODVEICULO = :NEW.CODVEIPRIN;
    
      
 END IF;   
    

 IF P_USUEMP =1 AND P_CODEMP3 =1 THEN
   
      RAISE_APPLICATION_ERROR(-20101,AD_FC_FORMATAHTML_BISPO(''Veículo não pode ser utilizado'',
                                                              ''para a empresa selecionada'',
                                                              ''!''));
   END IF;
                    

END ;

END;


Maicon Scapatici

Maicon Scapatici

Curtidas 2

Melhor post

Ana Lichirgu

Ana Lichirgu

14/01/2019

Que ótimo Maicon! Tô com um problema parecido!!! Em homologação minha trigger funciona, porém em produção não... e elas estão iguais...

Minha sugestão para casos parecidos no futuro, rode cada select separado pra vc ver o retorno (é o que to fazendo).

Espero ter ajudado!
GOSTEI 2

Mais Respostas

Maicon Scapatici

Maicon Scapatici

18/12/2018

corrigindo essa linha eu errei na hora de postar:

 IF P_USUEMP =1 AND P_CODEMP3 =3 THEN
    
      RAISE_APPLICATION_ERROR(-20101,AD_FC_FORMATAHTML_BISPO(''Veículo não pode ser utilizado'',
                                                              ''para a empresa selecionada'',
                                                              ''!''));
   END IF;

GOSTEI 0
Maicon Scapatici

Maicon Scapatici

18/12/2018

Resolvido! Para quem passar pelo mesmo problema eis a solução:
Sempre que ele verificava o usuário logado e uma empresa exemplo a empresa 1, a variável da empresa 3 ficava vazia, corrigi efetuando exceptions para inserir valor 0 para quando não for obter valor e resolveu. Segue código corrigido:




CREATE OR REPLACE TRIGGER "AD_TGFVIAG_IUP_REGRAS"
BEFORE INSERT OR UPDATE ON TGFVIAG
FOR EACH ROW
BEGIN

  
DECLARE
  
   P_CODEMP1   INT;
   P_CODEMP3   INT;
   P_USUEMP    INT;
  
  BEGIN
   BEGIN
       BEGIN
    
    /* Empresa do usuario */
    SELECT TSIUSU.CODEMP 
    INTO P_USUEMP  
    FROM TSIUSU 
    WHERE TSIUSU.CODUSU = STP_GET_CODUSULOGADO();
    
        /* Busca o CODINSTPRINC e grava na variavel de empresa 3 */
    SELECT AD_TGFVEIEMP.CODEMP
    INTO P_CODEMP3
    FROM TGFVEI, AD_TGFVEIEMP
    WHERE TGFVEI.CODVEICULO = AD_TGFVEIEMP.CODVEICULO
    AND AD_TGFVEIEMP.CODEMP = 3
    AND TGFVEI.CODVEICULO = :NEW.CODVEIPRIN;
    EXCEPTION
   WHEN NO_DATA_FOUND then
      P_CODEMP3 := 0;
      END;
                                             
   /* Busca o CODINSTPRINC e grava na variavel de empresa 1 */
    SELECT AD_TGFVEIEMP.CODEMP
    INTO P_CODEMP1
    FROM TGFVEI, AD_TGFVEIEMP
    WHERE TGFVEI.CODVEICULO = AD_TGFVEIEMP.CODVEICULO
    AND AD_TGFVEIEMP.CODEMP = 1
    AND TGFVEI.CODVEICULO = :NEW.CODVEIPRIN;
    EXCEPTION
    WHEN NO_DATA_FOUND then
     P_CODEMP1 := 0;
 END;
      
   /* Regrava o  buffer :NEW.CODEMP */
 IF P_USUEMP =1 AND P_CODEMP3 <>0 THEN
   
      RAISE_APPLICATION_ERROR(-20101,AD_FC_FORMATAHTML_BISPO('Veículo selecionado não pode ser',
                                                              'utilizado para esta empresa',
                                                              'Operação Será Cancelada'));
   END IF;
   
   
   IF P_USUEMP =3 AND P_CODEMP1 <>0 THEN
   
      RAISE_APPLICATION_ERROR(-20101,AD_FC_FORMATAHTML_BISPO('Veículo selecionado não pode ser',
                                                              'utilizado para esta empresa',
                                                              'Operação Será Cancelada'));
   END IF;
                    

END ;

END;





GOSTEI 1
Maicon Scapatici

Maicon Scapatici

18/12/2018

Que ótimo Maicon! Tô com um problema parecido!!! Em homologação minha trigger funciona, porém em produção não... e elas estão iguais...

Minha sugestão para casos parecidos no futuro, rode cada select separado pra vc ver o retorno (é o que to fazendo).

Espero ter ajudado!


Bom dia Ana! Obrigado pela sugestão! Vou começar a fazer isso sim. Tenha um bom fim de semana!
GOSTEI 0
POSTAR