AJUDA COM TRIGGERS E PROCEDURES NO SQL SERVER

INACIOJUNIOR10 13/06/2012 17:16:25
#404083
Boa tarde amigos do vbmania, estou desenvolvendo um trabalho da faculdade e gostaria de uma luz, bem é um sistema simples, de locadora, já fiz todo o sistema em VB.NET e já está tudo funcionando perfeitamente dentro do sistema, o incluir, alterar, excluir, listar, os relatórios estão todos prontos, porém estou com muitos problemas para fazer as Triggers e Procedures dentro do SQL Server 2008 Express (é a 1º vez que faço uma Trigger).

Vou deixar abaixo o código de criação das tabelas e quais as Triggers e Procedures devem ser criadas, se alguém puder me ajudar, muito obrigado.

#------ Sintaxe de Criação das Tabelas, já com o Relacionamento entre elas ---------#

CREATE TABLE Filme (
titulo nvarchar(30),
quantidade_disponivel_locacao int,
faixa_etaria int,
valor_diario money,
cod_filme int PRIMARY KEY
)

CREATE TABLE Cliente (
cod_cliente int PRIMARY KEY,
cpf nvarchar(11),
valor_locado money,
nome nvarchar(50),
data_nascimento smalldatetime
)

CREATE TABLE Exemplar (
midia nvarchar(20),
cod_exemplar int PRIMARY KEY,
cod_filme int,
FOREIGN KEY(cod_filme) REFERENCES Filme (cod_filme)
)

CREATE TABLE Locacao (
cod_locacao int PRIMARY KEY,
data_devolucao smalldatetime,
valor_total smalldatetime,
valor_pago smalldatetime,
data_locacao smalldatetime,
cod_cliente int,
cod_funcionario int,
FOREIGN KEY(cod_cliente) REFERENCES Cliente (cod_cliente)
)

CREATE TABLE Reserva (
data_reserva smalldatetime,
cod_cliente int,
cod_filme int,
cod_funcionario int,
PRIMARY KEY(cod_cliente,cod_filme,cod_funcionario)
)

CREATE TABLE Funcionario (
cod_funcionario int PRIMARY KEY,
telefone nvarchar(10),
cargo nvarchar(30),
cpf nvarchar(11),
nome nvarchar(50)
)

CREATE TABLE Exemplares_Locados (
cod_exemplar int,
cod_locacao int,
FOREIGN KEY(cod_exemplar) REFERENCES Exemplar (cod_exemplar),
FOREIGN KEY(cod_locacao) REFERENCES Locacao (cod_locacao)
)

ALTER TABLE Locacao ADD FOREIGN KEY(cod_funcionario) REFERENCES Funcionario (cod_funcionario)

#------ Sintaxe de Criação das Tabelas, já com o Relacionamento entre elas ---------#

Bem as Triggers são o seguinte:

A tabela FILME tem uma coluna para quantidade exemplares disponiveis (quantidade_disponivel_locacao), toda locação realizada quando um exemplar for retirado ou colocado naquela locação em aberto este campo deve ser atualizado automaticamente.

A tabela LOCAÇÃO com a coluna valor deve ter seu valor alterado automaticamente de acordo com os exemplares que estão sendo colocados ou retirados no momento da mesma.

A tabela CLIENTE com a coluna valor locado que representa tudo que ele ja gastou em locações na locadora deve ser atualizado automaticamente toda vez que uma locação for encerrada (foram devolvidos todos os exemplares).

Quando uma tentativa de fazer reserva de um filme é realizada deve-se testar se a quantidade de reservas não é superior a quantidade de exemplares existentes no sistema (campo quantidade_total na tabela FILME) e disparar uma exceção caso nao seja possível realizar a reserva.

O campo quantidade_total da tabela FILME deve ser atualizado toda vez que um exemplar é inserido, atualizado ou excluído do sistema.

Bem, quem puder me ajudar apenas com a 1º Trigger já está de bom tamanho, obrigado.
KERPLUNK 13/06/2012 17:27:46
#404086
Bem, para começo de conversa, o design do seu banco, na minha opinião, não está bom, pelos seguintes motivos:
1 - Os ítens do acervo(livro, filme, disco...), são únicos. Isso quer dizer que você ter 3 exemplares de [Ô]E o vendo levou[Ô], não quer dizer que você tenha um registro com uma coluna contendo o número de exemplares, e sim 3 registros, ainda que com dados repetidos(na teoria), excetuando o código interno que cada exemplar teria com o sistema. Isso facilitaria demais para saber qual exemplar específico cada cliente locou, evitando confusões.
2 - Cada locação gera um registro de locação para um determinado cliente, com o código interno único do ítem do acervo. Isso dá a possibilidade de rastreamento do ítem. Imagine que o cliente devolve o ítem com defeito? Como você vai saber qual dos 3 exemplares de [Ô]E o vento levou[Ô] foi danificado e por qual cliente para cobrar a multa?
3 - Controlando cada ítem com um código interno único, melhoraria também o processo da reserva, pois se você não diferencia um ítem do outro, dificulta para saber qual reservar...

Mas para seu problema:
Criando triggers no sql server
INACIOJUNIOR10 13/06/2012 17:50:09
#404090
Boa tarde Kerplunk, acho que talvez o script esteja um pouco fora de ordem, gerei o script automaticamente, vou postar um print do DTR para vc poder analisar, existe uma tabela Exemplares_Locados onde é uma coleção de exemplares locados para 1 locação.

Na verdade é apenas um exempo simples, nada profissional, eu já consultei na internet a sintaxe, e até tentei fazer as Triggers antes de postar, porém estou um pouco confuso em relação a quando disparo a trigger, antes, ou depois da locação...
INACIOJUNIOR10 14/06/2012 17:36:14
#404186
Opa, verifiquei que havia alguns erros no script, vou postar o script de criação das tabelas novamente, ainda estou apanhando um pouco das triggers e procedures, mas agora é mais logica do sintaxe...

CREATE TABLE Filme (
titulo nvarchar(30),
quantidade_disponivel_locacao int,
faixa_etaria int,
valor_diario money,
cod_filme int PRIMARY KEY,
quantidade_total char(1)
)

CREATE TABLE Cliente (
cod_cliente int PRIMARY KEY,
cpf nvarchar(11),
valor_locado money,
nome nvarchar(50),
data_nascimento datetime
)

CREATE TABLE Funcionario (
cod_funcionario int PRIMARY KEY,
telefone nvarchar(10),
cargo nvarchar(30),
cpf nvarchar(11),
nome nvarchar(50)
)

CREATE TABLE Exemplar (
midia nvarchar(20),
cod_exemplar int PRIMARY KEY,
cod_filme int,
FOREIGN KEY(cod_filme) REFERENCES Filme (cod_filme)
)

CREATE TABLE Locacao (
cod_locacao int PRIMARY KEY,
data_devolucao datetime,
valor_total datetime,
valor_pago datetime,
data_locacao datetime,
cod_cliente int,
cod_funcionario int,
FOREIGN KEY(cod_cliente) REFERENCES Cliente (cod_cliente),
FOREIGN KEY(cod_funcionario) REFERENCES Funcionario (cod_funcionario)
)

CREATE TABLE Reserva (
data_reserva datetime,
cod_cliente int,
cod_filme int,
cod_funcionario int,
PRIMARY KEY(cod_cliente,cod_filme,cod_funcionario)
)

CREATE TABLE Exemplares_Locados (
cod_exemplar int,
cod_locacao int,
FOREIGN KEY(cod_exemplar) REFERENCES Exemplar (cod_exemplar),
FOREIGN KEY(cod_locacao) REFERENCES Locacao (cod_locacao)
)

Tópico encerrado , respostas não são mais permitidas