Trigger - duas tabelas
20/12/2004
0
TABELA A :
IdTba (P.K)
Nome
TABELA B:
IdTbb(P.K)
Nome
CodTba(F.K)
Criar as tabelas TBA e TBB sem restrição de P.K. Até aqui é simples.
Agora preciso fazer uma trigger para checar na Tabela A a P.K. Por exemplo: nao haver repeticao de dados na tabela...
Aqui que estou me enroscando...se alguem puder me ajudar! Agradeco!
Renatodervelan
Posts
21/12/2004
Marcus.magalhaes
Vc está usando MS SQL Server?
Vamos ver se entendi a pergunta, vc não quer que os dados inseridos na tabela A se repitam?
Se for isso, crie um PK na tabela A.
[color=green:d0d25d07d0]Create Table TABELA_A
(
IdTba Int NOT NULL,
Nome VarChar(30) NOT NULL,[/color:d0d25d07d0]
[color=red:d0d25d07d0] Constraint PK_TABELA_A Primary Key Clustered --o Clustered é opcional
(
IdTba
)[/color:d0d25d07d0]
[color=green:d0d25d07d0])
GO[/color:d0d25d07d0]
ou então, vc poderia criar o ID como autonumeração:
[color=green:d0d25d07d0]Create Table TABELA_A
(
IdTba Int Identity(1, 1) NOT NULL,
Nome VarChar(30) NOT NULL,[/color:d0d25d07d0]
[color=red:d0d25d07d0] Constraint PK_TABELA_A Primary Key Clustered --o Clustered é opcional
(
IdTba
)[/color:d0d25d07d0]
[color=green:d0d25d07d0])
GO[/color:d0d25d07d0]
Att,
21/12/2004
Renatodervelan
Como é um trabalho, o professor não quer que eu crie uma tabela
definindo a P.K. Mas , quer que eu faça uma trigger que faça a mesma função se eu a tivesse definido. Então , tenho que fazer uma trigger para que não houvesse repetição de dados.
Obrigado.
22/12/2004
Marcus.magalhaes
Se é para tratar por trigger, como a ela age DEPOIS do evento ter ocorrido, então teremos 2 situações distintas :
1) Sem o controle de transação, o que nos obriga a trabalhar com as tabelas temporárias INSERTED e DELETED; e
2) Com o controle de transação, que faz com que o código seja bem mais limpo.
Veja exemplos das duas situações :
[color=red:0c620054e3]Drop Table TABELA_A
GO
Create Table TABELA_A
(
IdTbaInt,
NomeVarChar(30)
)
GO
Drop Table TABELA_B
GO
Create Table TABELA_B
(
IdTbbInt,
NomeVarChar(30),
CodTbaInt
)
GO
Drop Trigger trg_TABELA_A_INS_UPD
GO
-- Se NÃO PUDER usar transação
Create Trigger trg_TABELA_A_INS_UPD On TABELA_A For Insert, Update
As
Begin
-- Declara variáveis para comparação e recuperação de valores
Declare @var_idtbaInt,
@var_nomeVarChar(30),
@var_idtba_antInt,
@var_nome_antVarChar(30)
-- Recupera os dados da linha que está sendo inserida
Select @var_idtba = IDTBA, @var_nome = NOME
From Inserted
-- Recupera os dados da linhas que está sofrendo update
Select @var_idtba_ant = IDTBA, @var_nome_ant = NOME
From Deleted
If (Select Count(*) From TABELA_A Where IDTBA = @var_idtba) > 1
Begin
Select ´O Valor já existe o registro antigo NÃO SERÁ substituido pelo novo´
-- Apaga a linha nova que está sendo duplicada, utilizando para isso todas as colunas da tabela para evitar que
-- os dados antigos sejam apagados e permaneçam somente os dados novos
Delete
From TABELA_A
Where IDTBA = @var_idtba
And NOME = @var_nome
-- Em caso de repetição completa da linha, todas as linhas foram apagadas, portanto é necessário que ao menos 1 permaneça
-- Como os dados de todas as colunas são iguais, podemos refazer o insert a partir da linha que foi inserida por último
If (Select Count(*) From TABELA_A Where IDTBA = @var_idtba) = 0
Begin
Insert Into TABELA_A (IDTBA, NOME) Values (@var_idtba, @var_nome)
End
-- Em caso de update de um código antigo para um código já existente, é necessário que recuperemos os dados antigos
If @var_idtba_ant Is Not NULL
Begin
Insert Into TABELA_A (IDTBA, NOME) Values (@var_idtba_ant, @var_nome_ant)
End
End
End
GO
Insert Into TABELA_A (IDTBA, NOME) Values (1, ´Marcus´)
Insert Into TABELA_A (IDTBA, NOME) Values (2, ´Renato´)
Insert Into TABELA_A (IDTBA, NOME) Values (3, ´Joao´)
Insert Into TABELA_A (IDTBA, NOME) Values (4, ´Wilson´)
GO
Select *
From TABELA_A
GO
Insert Into TABELA_A (IDTBA, NOME) Values (1, ´Joaquim´)
GO
Select *
From TABELA_A
GO
Insert Into TABELA_A (IDTBA, NOME) Values (1, ´Marcus´)
GO
Select *
From TABELA_A
GO
Update TABELA_A
Set IDTBA = 2
Where IDTBA = 3
GO
Select *
From TABELA_A
GO
Drop Trigger trg_TABELA_A_INS_UPD
GO
-- Se PUDER usar transação
Create Trigger trg_TABELA_A_INS_UPD On TABELA_A For Insert, Update
As
Begin
-- Em caso de duplicidade a transação será desfeita.
If (Select Count(*) From TABELA_A a Inner Join Inserted ins On a.IDTBA = ins.IDTBA) > 1
Begin
Select ´O Valor já existe o registro antigo NÃO será substituido pelo novo´
Rollback Tran
End
Else
-- Se não houver duplicidade, a transação será concluída.
Begin
Select ´O Valor não existe´
Commit Tran
End
End
GO
Delete
From TABELA_A
GO
Insert Into TABELA_A (IDTBA, NOME) Values (1, ´Marcus´)
GO
Insert Into TABELA_A (IDTBA, NOME) Values (2, ´Renato´)
GO
Insert Into TABELA_A (IDTBA, NOME) Values (3, ´Joao´)
GO
Insert Into TABELA_A (IDTBA, NOME) Values (4, ´Wilson´)
GO
Select *
From TABELA_A
GO
Begin Tran
Insert Into TABELA_A (IDTBA, NOME) Values (1, ´Joaquim´)
GO
Select *
From TABELA_A
GO
Update TABELA_A
Set IDTBA = 2
Where IDTBA = 3
GO
Select *
From TABELA_A
GO
Drop Trigger trg_TABELA_A_INS_UPD
GO
Drop Table TABELA_A
GO
Drop Table TABELA_B
GO[/color:0c620054e3]
Espero ter ajudado.
Att,
Clique aqui para fazer login e interagir na Comunidade :)