Array
(
)

Trigger - duas tabelas

Renatodervelan
   - 20 dez 2004

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!

Marcus.magalhaes
   - 21 dez 2004

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.

Create Table TABELA_A
(
IdTba Int NOT NULL,
Nome VarChar(30) NOT NULL,
Constraint PK_TABELA_A Primary Key Clustered --o Clustered é opcional
(
IdTba
)
)
GO

ou então, vc poderia criar o ID como autonumeração:

Create Table TABELA_A
(
IdTba Int Identity(1, 1) NOT NULL,
Nome VarChar(30) NOT NULL,
Constraint PK_TABELA_A Primary Key Clustered --o Clustered é opcional
(
IdTba
)
)
GO

Att,

Renatodervelan
   - 21 dez 2004

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.

Marcus.magalhaes
   - 22 dez 2004

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 :

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

Espero ter ajudado.

Att,