Usuário com melhor resposta
TRIGGER DE BLOQUEIO DE UPDATE COM CONDIÇÃO

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.
Respostas
-
Deleted
- Marcado como Resposta CHARLES.PTU segunda-feira, 19 de fevereiro de 2018 16:50
-
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.
- Editado Mailson Santana sexta-feira, 9 de fevereiro de 2018 16:37
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.
- Editado Mailson Santana sexta-feira, 9 de fevereiro de 2018 16:37
-
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 14 de fevereiro de 2018 11:21
-
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
-
Deleted
- Marcado como Resposta CHARLES.PTU segunda-feira, 19 de fevereiro de 2018 16:50
-
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
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]
-