Trigger - duas tabelas

20/12/2004

0

Estou fazendo um trabalho e estou com o seguinte problema:

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

Renatodervelan

Responder

Posts

21/12/2004

Marcus.magalhaes

Bom dia Renato.

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,


Responder

21/12/2004

Renatodervelan

Ola marcus, obrigado pela ajuda, mas não é isso que eu queria.
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.


Responder

22/12/2004

Marcus.magalhaes

Bom dia Renato.

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,


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar