Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

filipescoob

Erro ao Criar Trigger

Recommended Posts

Salve galera,

 

Nunca havia mechido com trigger esta manhã então peguei o exemplo no Help do SQL para poder entender seu funcionamento.

 

segue exemplo

 

USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_NAME = 'employeeData')
   DROP TABLE employeeData
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_NAME = 'auditEmployeeData')
   DROP TABLE auditEmployeeData
GO
CREATE TABLE employeeData (
   emp_id int NOT NULL,
   emp_bankAccountNumber char (10) NOT NULL,
   emp_salary int NOT NULL,
   emp_SSN char (11) NOT NULL,
   emp_lname nchar (32) NOT NULL,
   emp_fname nchar (32) NOT NULL,
   emp_manager int NOT NULL
   )
GO
CREATE TABLE auditEmployeeData (
   audit_log_id uniqueidentifier DEFAULT NEWID(),
   audit_log_type char (3) NOT NULL,
   audit_emp_id int NOT NULL,
   audit_emp_bankAccountNumber char (10) NULL,
   audit_emp_salary int NULL,
   audit_emp_SSN char (11) NULL,
   audit_user sysname DEFAULT SUSER_SNAME(),
   audit_changed datetime DEFAULT GETDATE()
   )
GO
CREATE TRIGGER updEmployeeData 
ON employeeData 
FOR update AS
/*Check whether columns 2, 3 or 4 has been updated. If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1))+power(2,(3-1))+power(2,(4-1)) = 14. To check if all columns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/

   IF (COLUMNS_UPDATED() & 14) > 0
/*Use IF (COLUMNS_UPDATED() & 14) = 14 to see if all of columns 2, 3, and 4 are updated.*/
	  BEGIN
-- Audit OLD record.
	  INSERT INTO auditEmployeeData
		 (audit_log_type,
		 audit_emp_id,
		 audit_emp_bankAccountNumber,
		 audit_emp_salary,
		 audit_emp_SSN)
		 SELECT 'OLD', 
			del.emp_id,
			del.emp_bankAccountNumber,
			del.emp_salary,
			del.emp_SSN
		 FROM deleted del

-- Audit NEW record.
	  INSERT INTO auditEmployeeData
		 (audit_log_type,
		 audit_emp_id,
		 audit_emp_bankAccountNumber,
		 audit_emp_salary,
		 audit_emp_SSN)
		 SELECT 'NEW',
			ins.emp_id,
			ins.emp_bankAccountNumber,
			ins.emp_salary,
			ins.emp_SSN
		 FROM inserted ins
   END
GO

/*Inserting a new employee does not cause the UPDATE trigger to fire.*/
INSERT INTO employeeData
   VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32)
GO

/*Updating the employee record for employee number 101 to change the salary to 51000 causes the UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
   SET emp_salary = 51000
   WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO

/*Updating the employee record for employee number 101 to change both the bank account number and social security number (SSN) causes the UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
   SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
   WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO

Porem quando adaptei para o que precisava deu o seguinte erro

 

segue exemplo completo

 

CREATE TRIGGER TRG_LETRA 
ON TB_LETRA
FOR UPDATE, DELETE AS
/*Check whether columns 2, 3 or 4 has been updated. If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1))+power(2,(3-1))+power(2,(4-1)) = 14. To check if all columns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/

   IF (COLUMNS_UPDATED() & 14) > 0
/*Use IF (COLUMNS_UPDATED() & 14) = 14 to see if all of columns 2, 3, and 4 are updated.*/
	  BEGIN
-- Audit OLD record.
	  INSERT INTO TB_LETRA_HIST
		 (
	 LET_VAR_TIPO,
	 LET_INT_HIST_ID,
		 LET_VAR_HIST_LETRA,
		 LET_VAR_HIST_DESCRICAO,
		 LET_INT_HIST_ATIVO,
		 LET_DAT_HIST_CADASTRO,
	 LET_INT_HIST_USU_CADASTRO,
	 LET_DAT_HIST_ALTERADO_EM,
	 LET_DAT_HIST_LIBERADO
	)
		 SELECT 'OLD', 
			del.LET_INT_ID,
			del.LET_VAR_LETRA,
			del.LET_VAR_DESCRICAO,
			del.LET_INT_ATIVO,
		  del.LET_DAT_CADASTRO,
		del.LET_INT_USU_CADASTRO,
		del.LET_DAT_ALTERADO_EM,
		del.LET_DAT_HIST_LIBERADO
		 FROM deleted del

-- Audit NEW record.
	  INSERT INTO TB_LETRA_HIST
	(
	   	 LET_VAR_TIPO,
	 LET_INT_HIST_ID,
		 LET_VAR_HIST_LETRA,
		 LET_VAR_HIST_DESCRICAO,
		 LET_INT_HIST_ATIVO,
		 LET_DAT_HIST_CADASTRO,
	 LET_INT_HIST_USU_CADASTRO,
	 LET_DAT_HIST_ALTERADO_EM,
	 LET_DAT_HIST_LIBERADO
 	)
		 SELECT 'NEW',
			ins.LET_INT_HIST_ID,
			ins.LET_VAR_HIST_LETRA,
			ins.LET_VAR_HIST_DESCRICAO,
			ins.LET_INT_HIST_ATIVO,
		  ins.LET_DAT_HIST_CADASTRO,
		ins.LET_INT_HIST_USU_CADASTRO,
		ins.LET_DAT_ALTERADO_EM,
		ins.LET_DAT_HIST_LIBERADO
		 FROM inserted ins
   END
GO

Erros

Server: Msg 207, Level 16, State 3, Procedure TRG_LETRA, Line 10
Invalid column name 'LET_DAT_HIST_LIBERADO'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_INT_HIST_ID'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_VAR_HIST_LETRA'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_VAR_HIST_DESCRICAO'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_INT_HIST_ATIVO'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_DAT_HIST_CADASTRO'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_INT_HIST_USU_CADASTRO'.
Server: Msg 207, Level 16, State 1, Procedure TRG_LETRA, Line 34
Invalid column name 'LET_DAT_HIST_LIBERADO'.

Porem ja criei as tabelas como consta no script abaixo e dou select, insert, update normal na tabela.

 

CREATE TABLE TB_LETRA
(
LET_INT_ID INT IDENTITY(1,1) NOT NULL,
LET_VAR_LETRA VARCHAR(3),
LET_VAR_DESCRICAO VARCHAR(100),
LET_INT_ATIVO INT NOT NULL DEFAULT 1,
LET_DAT_CADASTRO DATETIME NOT NULL DEFAULT GETDATE(),
LET_INT_USU_CADASTRO INT NOT NULL,
LET_DAT_ALTERADO_EM DATETIME NULL,
LET_DAT_LIBERADO INT NOT NULL DEFAULT 0,
CONSTRAINT PK_LETINTID_LETRA PRIMARY KEY(LET_INT_ID),
CONSTRAINT FK_LETINTUSUCADASTRO_LETRA FOREIGN KEY(LET_INT_USU_CADASTRO) REFERENCES TB_USUARIO(USU_INT_ID),
CONSTRAINT UQ_LETVARLETRA_LETRA UNIQUE(LET_VAR_LETRA)
)

CREATE TABLE TB_LETRA_HIST
(
LET_VAR_TIPO VARCHAR(10),
LET_INT_HIST_ID INT NULL,
LET_VAR_HIST_LETRA VARCHAR(3),
LET_VAR_HIST_DESCRICAO VARCHAR(100),
LET_INT_HIST_ATIVO INT NULL,
LET_DAT_HIST_CADASTRO DATETIME NULL,
LET_INT_HIST_USU_CADASTRO INT NULL,
LET_DAT_HIST_ALTERADO_EM DATETIME NULL,
LET_DAT_HIST_LIBERADO INT NULL,
CONSTRAINT FK_LETINTHISTUSUCADASTRO_LETRA FOREIGN KEY(LET_INT_HIST_USU_CADASTRO) REFERENCES TB_USUARIO(USU_INT_ID)
)

 

Alguem sabe o que pode estar acontecendo ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ninguem manja de Trigger tambem!!!!

Nunca precisei usar isto, fiz curso na impacta e o professor nem sequer falou na bendita.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.