TRIGGER UPDATE SQL SERVER
-
terça-feira, 15 de maio de 2012 20:20
Olá, tenho um Banco de Cadastros no Sql Server(Cadastro de Funcionários pra ser mais preciso)
E quero criar uma Trigger que bloqueie a edição dos campos IdBenefício(int null), StatusBenefício(int not null) quando o Campo DatadeAdmissão for menor que 2010.
No caso se o ano(YEAR(DatAdm)) for maior que 2011 a edição poderá ser feita normalmente.
Mas caso for menor, aparecer uma mensagem RAISERROR('A nota %d não pode ser inserida por restrições ao banco',@Nota)
Gostaria de saber como faço essa Trigger, estou sendo treinado por uma empresa e foi me dada essa tarefa.
Quero se possível um exemplo claro e conciso, pois como sou aprendiz iniciante, dependo de muita cautela!
Desde já obrigado.
Todas as Respostas
-
quarta-feira, 16 de maio de 2012 12:29
Olá Junior,
acredito que seria mais ou menos assim,
CREATE TRIGGER [dbo].[TRG_Update] ON SUA_TABELA INSTEAD OF UPDATE AS BEGIN SET NOCOUNT ON -- Caso o ano seja < 2011 e os campos idBEnedicio ou Status Beneficio tenhão sido alterados IF ((SELECT YEAR(DatAdm) FROM INSERTED) < 2011 AND (SELECT COUNT(*) FROM INSERTED A INNER JOIN DELETED B ON A.CAMPO_CHAVE = B.CAMPO_CHAVE WHERE a.IdBenefício <> b.IdBenefício or a.StatusBenefício <> b.StatusBenefício) > 0) BEGIN DECLARE @NOTA INT --Obtem o valor da nota SELECT @NOTA = CAMPO_DA_NOTA FROM INSERTED RAISERROR('A nota %d não pode ser inserida por restrições ao banco',16,1, @NOTA) END ELSE BEGIN -- Faz o update normalmente UPDATE SUA_TABELA SET CAMPO1 = INSERTED.CAMPO1 ,CAMPO2 = INSERTED.CAMPO2 ,CAMPO3 = INSERTED.CAMPO3 ,CAMPO4 = INSERTED.CAMPO4 FROM inserted where campo_chave = inserted.campo_chave END ENDAtt.
Lukas Baldan- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 16 de maio de 2012 14:19
-
quarta-feira, 16 de maio de 2012 12:58
Bom dia Junior,
A trigger pode ser implementada utilizando FOR UPDATE e em situações em que a gravação não deva ser autorizada, dar um ROLLBACK TRANSACTION. Assim você não precisa colocar todo o comando UPDATE na cláusula ELSE. A trigger apenas bloqueará os updates indevidos.
Exemplo:
/* substitua pelo nome de sua tabela; dê também um nome de sua escolha para a trigger */ CREATE TRIGGER trg_RestricaoCadastro ON NomeTabela FOR UPDATE AS DECLARE @Erros INT, @Nota INT; /* Identifica se o campo DataDeAdmissao deste registro é menor que 2010, e caso seja, verifica se houve alterações no ID e Status do Benefício */ SELECT @Erros = COUNT(*) FROM inserted AS i INNER JOIN deleted AS d ON d.SeuID = i.SeuID /* substitua pela coluna de identificação de sua tabela */ WHERE (YEAR(d.DataDeAdmissao) < 2010) AND ((i.IdBeneficio <> d.IdBeneficio) OR (i.StatusBeneficio <> d.StatusBeneficio)); /* Valida se houve alguma operação não permitida */ IF (@Erros <> 0) BEGIN SELECT @Nota = Nota FROM deleted; /* substitua pela coluna que contém o número da nota */ RAISERROR('A nota %d não pode ser inserida por restrições ao banco!', 16, 1, @Nota); ROLLBACK TRANSACTION; RETURN; END GO[]'s
MCP | MCTS SQL Server 2008 Database Developer
- Editado Filipe M. Oliveira quarta-feira, 16 de maio de 2012 13:01
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 16 de maio de 2012 14:19

