none
TRIGGER UPDATE SQL SERVER

    Pergunta

  • 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.

    terça-feira, 15 de maio de 2012 20:20

Todas as Respostas

  • 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
    
    END


    Att.
    Lukas Baldan

    quarta-feira, 16 de maio de 2012 12:29
  • 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

    quarta-feira, 16 de maio de 2012 12:58