Usuário com melhor resposta
Atualizar campo via trigger

Pergunta
-
Pessoal, estive olhando a estrutura das triggers instead of mais ainda não cheguei numa forma de fazer o seguinte.
Tenho uma tabela com um campo chamado processamento. Eu não tenho levantado todos os lugares ou sistemas que dão manutenção nesta tabela.
A tabela teria uma estrutura resumida assim:
CREATE TABLE [dbo].[Cadastro]( [CODI] [varchar](22) NOT NULL, [NOME] [varchar](200) NULL, [Processamento] [char](1) NULL,
Eu gostaria de criar uma trigger nesta tabela para SEMPRE setar este campo como PROCESSAMENTO = 'S', independente de ser inclusão ou alteração.
CONSTRAINT [PK_Cadastro] PRIMARY KEY CLUSTERED ( [CODI] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
Neste caso seriam as famosas triggers before insert/update.
Atenciosamente
Danilo
Respostas
-
Danilo, Trigger são bem simples de se implementar:
Create Trigger tgrCadastro
On [Cadastro]
For Insert, Update
asBegin
Update A
set A.Processamento = 'S'
From [Cadastro] A
Inner Join Inserted B On A.CODI = B.CODIEnd
GO
Insert Into Cadastro (CODI, NOME) Values ('1', 'Teste')
GO
Select * from Cadastro
GO
Disable Trigger tgrCadastro On Cadastro
GO
Insert Into Cadastro (CODI, NOME) Values ('2', 'Teste2')
GO
Insert Into Cadastro (CODI, NOME) Values ('3', 'Teste3')
GO
Select * from Cadastro
GO
Enable Trigger tgrCadastro On Cadastro
GO
Update Cadastro set Nome = 'Teste3.1' Where CODI = '3'
GO
Select * from Cadastro
GO
Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/- Marcado como Resposta Danilo Rogério quarta-feira, 4 de novembro de 2009 11:40
Todas as Respostas
-
Danilo, Trigger são bem simples de se implementar:
Create Trigger tgrCadastro
On [Cadastro]
For Insert, Update
asBegin
Update A
set A.Processamento = 'S'
From [Cadastro] A
Inner Join Inserted B On A.CODI = B.CODIEnd
GO
Insert Into Cadastro (CODI, NOME) Values ('1', 'Teste')
GO
Select * from Cadastro
GO
Disable Trigger tgrCadastro On Cadastro
GO
Insert Into Cadastro (CODI, NOME) Values ('2', 'Teste2')
GO
Insert Into Cadastro (CODI, NOME) Values ('3', 'Teste3')
GO
Select * from Cadastro
GO
Enable Trigger tgrCadastro On Cadastro
GO
Update Cadastro set Nome = 'Teste3.1' Where CODI = '3'
GO
Select * from Cadastro
GO
Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/- Marcado como Resposta Danilo Rogério quarta-feira, 4 de novembro de 2009 11:40
-
Bom dia Fausto, a minha dúvida é se não corre o risco de ficar em "loop" ou com o chamavamos no Oracle "Trigger mutating". Porque eu mando o comando update para o banco e aí dispara a trigger e dentro de trigger eu faço update na mesma tabela.
-
Danilo, não quando a opção recursive_Triggers estiver desabilitada (é assim por Default)
Select Name, Is_recursive_Triggers_On
from sys.Databases
Where Database_Id = DB_ID()
Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/ -
bom dia Danilo,em uma instalação padrão do SQL Server, ele não permite esse comportamento de trigger recursiva.. aconselho a fazer um teste em uma máquina de testes, mas o seu update dentro da trigger não irá disparar a trigger novamente...para que isso acontecece vc teria que manualmente ativar a opção Recursive Triggers Enabled nas opções do seu banco de dados.. e mesmo nesse caso, depois de 20 loops o SQL Server iria automaticamente abortar a consulta e gerar um rollback..abs
Felipe Ferreira
http://weblogs.asp.net/felipeferreira
MCT, 2X MCITP, MCPD, 6X MCTS -
Danilo,
Utilizar Recursive Triggers com 20 loops de execução realmente é algo que devemos pensar, principalmente nas consequências que esta quantidade de loops poderá ocasionar no processamento dos servidores.
Outro detalhe o nível máximo de recursividade no SQL Server é de 32 níveis, sendo assim, isso é um número que devemos respeitar e o próprio SQL Server vai considerar durante o tempo de execução o nível que poderá tratar.
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA