none
TRIGGER DE BLOQUEIO DE UPDATE COM CONDIÇÃO RRS feed

  • Pergunta

  • boa tarde pessoal!

    Estou criando uma trigger para bloqueiar qualquer update que seja feito em um determinado dado e deixar fazer os insert, updates e deletes nos demais com a condição INSTEAD OF UPDATE. A trigger está bloqueando quando é feito o update no comando porém não está deixando fazer os processos normais nos demais dados.

    CREATE TRIGGER noUpdate
         on dbo.FCFO
         INSTEAD OF UPDATE 
    AS
    BEGIN
    IF EXISTS(SELECT * from FCFO where CODCFO = '00017431')
      BEGIN
      PRINT 'Cliente fornecedor ((TESTE)) Impossível de ser Alterado';
      ROLLBACK TRANSACTION;
      return;
      END;
    END;


    CharlesTI.

    sexta-feira, 9 de fevereiro de 2018 16:11

Respostas

  • Deleted
    • Marcado como Resposta CHARLES.PTU segunda-feira, 19 de fevereiro de 2018 16:50
    sábado, 10 de fevereiro de 2018 09:14
  • Boa tarde, Charles!

    Existem dois problemas nessa consulta. A primeira é que você está consultando a tabela e não o dado alterado, assim, enquanto houver pelo menos um registro na tabela FCFO onde o campo CodCFO for igual a 00017431 nenhum dado poderá ser atualizado. Como solução, você deve mudar a tabela FCFO para deleted no From. Assim a consulta ficaria dessa forma:

    SELECT * from Deleted where CODCFO = '00017431'

    O segundo ponto é que como você está utilizando Instead Of Update, caso o registro alterado não seja um registro onde o campo CodCFO for igual a 00017431, nenhum dado será alterado e nenhuma mensagem será apresentada, uma vez que o Instead Of Update substitui o Update pelo código da trigger. Dessa forma, no seu caso, você poderia mudar instead of por after update.



    sexta-feira, 9 de fevereiro de 2018 16:33

Todas as Respostas

  • Boa tarde, Charles!

    Existem dois problemas nessa consulta. A primeira é que você está consultando a tabela e não o dado alterado, assim, enquanto houver pelo menos um registro na tabela FCFO onde o campo CodCFO for igual a 00017431 nenhum dado poderá ser atualizado. Como solução, você deve mudar a tabela FCFO para deleted no From. Assim a consulta ficaria dessa forma:

    SELECT * from Deleted where CODCFO = '00017431'

    O segundo ponto é que como você está utilizando Instead Of Update, caso o registro alterado não seja um registro onde o campo CodCFO for igual a 00017431, nenhum dado será alterado e nenhuma mensagem será apresentada, uma vez que o Instead Of Update substitui o Update pelo código da trigger. Dessa forma, no seu caso, você poderia mudar instead of por after update.



    sexta-feira, 9 de fevereiro de 2018 16:33
  • Boa tarde Mailson.

    Mesmo fazendo este comando o mesmo não deixa eu editar os dados cuja o codcfo seja diferente do 00017431


    CharlesTI.

    sexta-feira, 9 de fevereiro de 2018 18:17
  • Deleted
    sexta-feira, 9 de fevereiro de 2018 18:31
  • Boa noite José Diz.

    A tabela possui sim algumas colunas!

    SELECT 
    AGRUPCOB,
    APLICFORMULA,
    ATIVO,
    BAIRRO,
    BAIRROENTREGA,
    BAIRROPGTO,
    CAIXAPOSTAL,
    CAIXAPOSTALENTREGA,
    CAIXAPOSTALPAGAMENTO,
    CALCULAAVP,
    CAMPOALFAOP1,
    CAMPOALFAOP2,
    CAMPOALFAOP3,
    CAMPOLIVRE,
    CATEGORIAAUTONOMO,
    CBOAUTONOMO,
    CEI,
    CEP,
    CEPCAIXAPOSTAL,
    CEPENTREGA,
    CEPPGTO,
    CFOIMOB,
    CGCCFO,
    CHAPA,
    CI_ORGAO,
    CI_UF,
    CIAUTONOMO,
    CIDADE,
    CIDADEENTREGA,
    CIDADEPGTO,
    CIDENTIDADE,
    CNAEPREP,
    CODCARGO,
    CODCFO,
    CODCFOCOLINTEGRACAO,
    CODCFOINTEGRACAO,
    CODCOLCFOFISCAL,
    CODCOLCHAVESESTRANG,
    CODCOLCONTAGER,
    CODCOLCXA,
    CODCOLFORMULA,
    CODCOLIGADA,
    CODCOLIGADAFILIALOBRA,
    CODCOLTCF,
    CODCONTAGER,
    CODCXA,
    CODETD,
    CODETDENTREGA,
    CODETDPGTO,
    CODEXTERNO,
    CODFILIALINTEGRACAO,
    CODFILIALOBRA,
    CODFINALIDADE,
    CODIGOINSS,
    CODLOJA,
    CODMUNICIPIO,
    CODMUNICIPIOENTREGA,
    CODMUNICIPIOPGTO,
    CODPAGTOGPS,
    CODPROF,
    CODRECEITA,
    CODTCF,
    CODTRA,
    CODUSUARIOACESSO,
    CODVINCULO,
    COMPLEMENTO,
    COMPLEMENTOPGTO,
    COMPLEMENTREGA,
    CONSIDERAFILIALOBRA,
    CONTATO,
    CONTATOENTREGA,
    CONTATOPGTO,
    CONTEVENTOCONTAB,
    CONTRIBUINTE,
    CONTRIBUINTEISS,
    DATACRIACAO,
    DATAOP1,
    DATAOP2,
    DATAOP3,
    DATAULTALTERACAO,
    DATAULTMOVIMENTO,
    DIGVERIFICDEBAUTOMATICO,
    DOCUMENTOESTRANGEIRO,
    DTINICATIVIDADES,
    DTNASCIMENTO,
    EMAIL,
    EMAILENTREGA,
    EMAILFISCAL,
    EMAILPGTO,
    EMPRESA,
    ENDCOBC,
    ENTIDADEEXECUTORAPAA,
    ESTADOCIVIL,
    FAP,
    FAX,
    FAXDEDICADO,
    FAXENTREGA,
    FAXPGTO,
    FILIALFINANCEIRA,
    FORMAPAGAMENTO,
    FORMATRIBUTACAO,
    FORMULAVALDEDUCAOVARIAVEL,
    IDCFO,
    IDCFOFISCAL,
    IDENTPORCNPJ,
    IDINTEGRACAO,
    IDPAIS,
    IDPAISENTREGA,
    IDPAISPGTO,
    INDNATRET,
    INOVAR_AUTO,
    INSCRESTADUAL,
    INSCRESTADUALST,
    INSCRMUNICIPAL,
    LIMITECREDITO,
    LOCALIDADE,
    LOCALIDADEENTREGA,
    LOCALIDADEPGTO,
    NACIONALIDADE,
    NIF,
    NIT,
    NOME,
    NOMEFANTASIA,
    NUMDEPENDENTES,
    NUMDIASATRASO,
    NUMERO,
    NUMEROENTREGA,
    NUMEROPGTO,
    NUMFUNCIONARIOS,
    OBRAPROPRIA,
    OPTANTEPELOSIMPLES,
    ORGAOPUBLICO,
    PAGREC,
    PAIS,
    PAISENTREGA,
    PAISPAGTO,
    PATRIMONIO,
    PERCENTACIDTRAB,
    PESSOAFISOUJUR,
    PORTE,
    PRODUTORRURAL,
    RAMOATIV,
    RECCREATEDBY,
    RECCREATEDON,
    RECMODIFIEDBY,
    RECMODIFIEDON,
    REGIMEISS,
    RETENCAOISS,
    RUA,
    RUAENTREGA,
    RUAPGTO,
    SATISFACAO,
    SIMBMOEDAINDEX,
    SITUACAONIF,
    STATUSCOTACAO,
    SUFRAMA,
    TELEFONE,
    TELEFONECOMERCIAL,
    TELEFONEENTREGA,
    TELEFONEPGTO,
    TELEX,
    TIPOBAIRRO,
    TIPOBAIRROENTREGA,
    TIPOBAIRROPGTO,
    TIPOCLIENTE,
    TIPOCONTRIBUINTEINSS,
    TIPOCONTROLEPONTO,
    TIPODOC,
    TIPOINSCRCNAB,
    TIPOOPCOMBUSTIVEL,
    TIPORENDIMENTO,
    TIPORUA,
    TIPORUAENTREGA,
    TIPORUAPGTO,
    TOMADORFOLHA,
    TPLOTACAO_OLD,
    TPTOMADOR,
    ULTIMODOCUMENTO,
    USARCUMULATRETENCAOPAGAR,
    USUARIOALTERACAO,
    USUARIOCRIACAO,
    VALFRETE,
    VALOROP1,
    VALOROP2,
    VALOROP3,
    VALORULTIMOLAN,
    VROUTRASDEDUCOESIRRF
    FROM FCFO


    • Editado CHARLES.PTU sexta-feira, 9 de fevereiro de 2018 23:28
    sexta-feira, 9 de fevereiro de 2018 23:27
  • Deleted
    • Marcado como Resposta CHARLES.PTU segunda-feira, 19 de fevereiro de 2018 16:50
    sábado, 10 de fevereiro de 2018 09:14
  • A tabela possui sim algumas colunas!

    São muitas colunas...  Qualquer alteração na estrutura da tabela FCFO poderia deixar o procedimento de gatilho defasado.

    Existe algum outro procedimento de gatilho ativo para a tabela FCFO, que intercepte UPDATE? Se não houver, que tal alterar o procedimento de gatilho para AFTER UPDATE, conforme sugerido anteriormente pelo Mailson?

    -- código #2
    
    CREATE TRIGGER dbo.noUpdate
         on dbo.FCFO
         after UPDATE as
    
    begin -- verifica número de linhas a tratar declare @NL int; set @NL= (SELECT count(*) from (SELECT top (2) * from INSERTED) as I); -- encerra o processamento se não há linha para tratar IF @NL = 0 return; -- rejeita bloco se houve atualização com código específico IF exists (SELECT * from INSERTED where CODCFO = '00017431') begin PRINT 'Cliente fornecedor ((TESTE)) não pode ser alterado'; ROLLBACK TRANSACTION; return; end; end; go

    e-mail       José Diz     Belo Horizonte, MG - Brasil



    Charles,

    Acredito que seja mais coerente as observações feitas pelo Maílson e José Diz, utilizar trigger Instead Of vai forçar o SQL Server a aplicar condições totalmente ao contrário do comportamento normal, o que em alguns casos não vai te ajudar a conseguir fazer o que esta querendo.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 14 de fevereiro de 2018 11:23
  • Obrigado José Diz, deu certo com o código #2.

    CharlesTI.

    segunda-feira, 19 de fevereiro de 2018 16:51