Antes de tudo crie a procedure da seguinte forma.
Vou criar uma de consulta, mas vc pode fazer o mesmo para inclusão, alteração, exclusão, etc.
Quando vc quiser alterar a procedure, é só inciar com ALTER PROCEDURE.
como eu identifico um campo deletado em uma trigger?
no mysql eu tenho a clausula old.
tentei utilizar essa clausula mas ela não funciona.
nem ela e nem a new.
elas existem no sql server 2008?
eu recomendo tu dar uma olhada na documentacao do sql server 2008. pq copy/paste de como funciona em um bd para outro nao rola. é bem diferente o sql server 2008 tem varias particularidades bem chatinhas mesmo. até que o site da M$ nao é tão ruim com informações sobre ele, só acho que deveria ficar mais centralizado as coisas.
[quote=luci.al]como eu recupero os valores do deleted para fazer um insert em outra tabela?
quero criar uma trigger que ao deletar uma tabela os dados dela vão para outra tabela (Clientes_deletados)
no mySql é assim:
INSERT INTO Clientes_deletados SET idClientef=old.idCliente, Endereco_idEndereco=old.Endereco_idEndereco ...
tentei substituir o old pelo deleted mas da erro.[/quote]
pq não é assim que se usa o deleted… veja fiz um exemplo:
[code]CREATE TRIGGER DLT ON Cliente AFTER DELETE
AS
BEGIN
DECLARE @id AS INT
DECLARE @nome AS VARCHAR(45)
DECLARE @cpf AS VARCHAR(15)
DECLARE @idade INT
DECLARE @SEXO VARCHAR(2)
SET @id=(SELECT idCLiente FROM deleted)
SET @nome=(SELECT nome FROM deleted)
SET @cpf=(SELECT cpf FROM deleted)
SET @idade=(SELECT idade FROM deleted)
SET @SEXO=(SELECT Sexo FROM deleted)
INSERT INTO DELETADOS VALUES(@id,@nome,@cpf,@idade,@SEXO)
END[/code]
[quote=luci.al]
…no mysql eu tenho a clausula old.
tentei utilizar essa clausula mas ela não funciona.
nem ela e nem a new.
elas existem no sql server 2008?[/quote]
outra coisa…só por título de conhecimento inserted e deleted são tabelas temporárias e não clausulas.
elas são criadas e deletadas junto com sua sessão.
não! essas tabelas são criadas no momento que a trigger é ativada(nesse exemplo no delete)… a cada vez que a trigger é ativada são criadas novas inserted e deleted que desaparecem junto com a sessão.
[quote=yhhik]não! essas tabelas são criadas no momento que a trigger é ativada(nesse exemplo no delete)… a cada vez que a trigger é ativada são criadas novas inserted e deleted que desaparecem junto com a sessão.
[/quote]
Mas então, foi o que eu disse, e se forem inseridos/deletados mais de um registro por vez?
Se eu usar um DELETE pra um intervalo de valores, todos esses valores estarão na deleted ,não?
[quote]Mas então, foi o que eu disse, e se forem inseridos/deletados mais de um registro por vez?
Se eu usar um DELETE pra um intervalo de valores, todos esses valores estarão na deleted ,não?[/quote]
Colega… elas só existem dentro da trigger(se vc tentar usar a deleted fora da trigger não vai dar certo) e guardam os valores somente da tabela que a trigger pertence, nesse exemplo se vc deletar o cliente e tentar deletar dados de uma segunda tabela só serão guardados os valores do cliente pq a trigger pertence a tabela cliente… toda vez que a trigger é ativada elas são criadas…se vc deletar 10 clientes a trigger será ativada 10 vzs.
Desculpe yhhik, acho que não fui claro no meu questionamento.
Quando digo “vários registros por vez” me refiro a apenas um único comando DELETE que apague mais de um registro.
A trigger é executada uma vez por comando e não por linha afetada.
Vou dar um exemplo em código pra exemplificar o que estou dizendo:
(Já estou com Sql server aqui e pude confirmar o que estou falando)
if OBJECT_ID('dbo.cliente') is not null
drop table dbo.cliente;
go
create table dbo.cliente
(
id int,
nome varchar(45),
cpf varchar(15),
idade int,
sexo varchar(2)
);
go
if OBJECT_ID('dbo.deletados') is not null
drop table dbo.deletados;
go
--criamos a tabela deletados para ser uma cópia da cliente
select * into dbo.deletados from dbo.cliente;
go
--preenchemos a tabela cliente com alguns exemplos
insert into cliente
select 1, 'andre', '11111111111', 15, 'M' union
select 2, 'bernado', '2222222222', 20, 'M' union
select 3, 'carla', '33333333333', 22, 'F' union
select 4, 'diana', '44444444444', 24, 'F' union
select 5, 'erasmo', '55555555555', 45, 'M' union
select 6, 'fabio', '66666666666', 35, 'M' union
select 7, 'geraldo', '77777777777', 28, 'M' ;
go
--confirmamos: sete pessoas lá
select * from cliente;
go
--criamos a trigger conforme modelo passado
CREATE TRIGGER DLT ON Cliente AFTER DELETE
AS
BEGIN
DECLARE @id AS INT
DECLARE @nome AS VARCHAR(45)
DECLARE @cpf AS VARCHAR(15)
DECLARE @idade INT
DECLARE @SEXO VARCHAR(2)
SET @id=(SELECT id FROM deleted)
SET @nome=(SELECT nome FROM deleted)
SET @cpf=(SELECT cpf FROM deleted)
SET @idade=(SELECT idade FROM deleted)
SET @SEXO=(SELECT Sexo FROM deleted)
INSERT INTO DELETADOS VALUES(@id,@nome,@cpf,@idade,@SEXO)
END
go
--apagamos 1 cliente da tabela: trigger funciona OK!
delete from dbo.cliente where id = 1;
--apagametos TODAS as mulheres da tabela (as 2): trigger FALHA!
delete from dbo.cliente where sexo = 'F';
go
--apagamos a trigger para recriar
drop trigger DLT;
go
--recriamos a trigger para lidar com todos registros em DELETED de uma vez
CREATE TRIGGER DLT ON Cliente AFTER DELETE
AS
BEGIN
INSERT INTO DELETADOS
SELECT * FROM deleted;
END
go
--tentamos apagar todas mulheres novamente: OK!
delete from dbo.cliente where sexo = 'F';
go
--só sobrou os homens na tabela
select * from dbo.cliente;
Não sei se em todos bancos de dados a trigger opera desta forma.
Tem um dos grandes (que não lembro qual agora) que a trigger é executada por linha afetada, eliminando este tipo de problema.
agora eu entendi.
realmente não funciona se delatar vários em um comando só.
mas depende do problema da moça… se a aplicação dela não permitir que sejam deletados vários de uma única vez, isso resolve o problema.
[quote=yhhik]agora eu entendi.
realmente não funciona se delatar vários em um comando só.
mas depende do problema da moça… se a aplicação dela não permitir que sejam deletados vários de uma única vez, isso resolve o problema.[/quote]
[quote=AbelBueno][quote=yhhik]
Colega… elas só existem dentro da trigger(se vc tentar usar a deleted fora da trigger não vai dar certo) e guardam os valores somente da tabela que a trigger pertence, nesse exemplo se vc deletar o cliente e tentar deletar dados de uma segunda tabela só serão guardados os valores do cliente pq a trigger pertence a tabela cliente… toda vez que a trigger é ativada elas são criadas…se vc deletar 10 clientes a trigger será ativada 10 vzs.
[/quote]
Desculpe yhhik, acho que não fui claro no meu questionamento.
Quando digo “vários registros por vez” me refiro a apenas um único comando DELETE que apague mais de um registro.
A trigger é executada uma vez por comando e não por linha afetada.
Vou dar um exemplo em código pra exemplificar o que estou dizendo:
(Já estou com Sql server aqui e pude confirmar o que estou falando)
Não sei se em todos bancos de dados a trigger opera desta forma.
Tem um dos grandes (que não lembro qual agora) que a trigger é executada por linha afetada, eliminando este tipo de problema.
[/quote]
kkk
só agora notei que vc criou outra trigger.
ficou bem melhor que a minha
e mais simples!