SQL Server: SPs, Triggers e Formas Normais do Banco de Dados
Classificado em Computação
Escrito em em
português com um tamanho de 6,91 KB
Procedimento Armazenado (SP): Inclusão de Compra
Desenvolvimento de um Procedimento Armazenado (SP) para inclusão de registros na tabela compras. O procedimento deve garantir que não seja permitida a inclusão de uma compra se o número da nota e o código do fornecedor já estiverem cadastrados. Em caso de sucesso, deve retornar o status de inclusão; caso contrário, retorna 0, acompanhado de uma mensagem informativa.
Código T-SQL: sp_addcompra
CREATE PROCEDURE sp_addcompra
(
-- Parâmetros de entrada
@num_nota INT,
@cod_fornecedor INT,
@data DATETIME,
@valor_total FLOAT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION;
-- Verifica se a compra já existe (Nota e Fornecedor)
IF (SELECT COUNT(*) FROM compras WHERE num_nota = @num_nota AND cod_fornecedor = @cod_fornecedor) = 0
BEGIN
-- Inclusão da nova compra
INSERT INTO compras (num_nota, cod_fornecedor, data, valor_total)
VALUES (@num_nota, @cod_fornecedor, @data, @valor_total);
-- Retorna sucesso (1) e mensagem
SELECT 1 AS resultado, 'Compra incluída com sucesso.' AS msg;
END
ELSE
BEGIN
-- Retorna falha (0) e mensagem
SELECT 0 AS resultado, 'Compra NÃO incluída, pois já existe um registro com esta Nota e Fornecedor.' AS msg;
END
COMMIT TRANSACTION;
END
Triggers: Atualização de Estoque e Valor Total da Nota
Implementação de Triggers na tabela ItensNota_compra para garantir a integridade e atualização automática de dados relacionados, como o estoque de produtos e o valor total da nota fiscal de compra. Nota: Os triggers foram corrigidos para suportar operações multi-row (múltiplas inserções/exclusões simultâneas).
Trigger de Inclusão (tr_ins_item)
Este trigger é executado após a inclusão de itens de compra, atualizando a quantidade em estoque na tabela Produtos e o valor total na tabela NotaFiscal_compra.
CREATE TRIGGER tr_ins_item
ON itensnota_compra
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- 1. Atualizar a quantidade em estoque (qde_estoque) na tabela Produtos
UPDATE P
SET P.qde_estoque = ISNULL(P.qde_estoque, 0) + I.qde
FROM Produtos P
INNER JOIN inserted I ON P.cod_produto = I.cod_produto;
-- 2. Atualizar o valor total (valor_total) na tabela NotaFiscal_compra
UPDATE NF
SET NF.valor_total = ISNULL(NF.valor_total, 0) + Sub.TotalItem
FROM NotaFiscal_compra NF
INNER JOIN (
SELECT
numnota,
cod_fornecedor,
SUM(qde * valor_u) AS TotalItem
FROM inserted
GROUP BY numnota, cod_fornecedor
) AS Sub ON NF.numnota = Sub.numnota AND NF.cod_fornecedor = Sub.cod_fornecedor;
END
Trigger de Exclusão (tr_del_item)
Este trigger é acionado após a exclusão de itens de compra, revertendo o impacto no estoque e subtraindo o valor correspondente do total da nota fiscal.
CREATE TRIGGER tr_del_item
ON itensnota_compra
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
-- 1. Atualizar a quantidade em estoque (qde_estoque) na tabela Produtos (subtraindo)
UPDATE P
SET P.qde_estoque = ISNULL(P.qde_estoque, 0) - D.qde
FROM Produtos P
INNER JOIN deleted D ON P.cod_produto = D.cod_produto;
-- 2. Atualizar o valor total (valor_total) na tabela NotaFiscal_compra (subtraindo)
UPDATE NF
SET NF.valor_total = ISNULL(NF.valor_total, 0) - Sub.TotalItem
FROM NotaFiscal_compra NF
INNER JOIN (
SELECT
numnota,
cod_fornecedor,
SUM(qde * valor_u) AS TotalItem
FROM deleted
GROUP BY numnota, cod_fornecedor
) AS Sub ON NF.numnota = Sub.numnota AND NF.cod_fornecedor = Sub.cod_fornecedor;
END
Normalização de Banco de Dados
A Normalização é o processo de substituir um conjunto de entidades e relacionamentos por um modelo melhorado, ou "purificado", em relação às anomalias de atualização (Inclusão, Alteração e Exclusão de Dados).
Abordagens da Normalização
- Sentido Top-Down (Cima para Baixo): Aplicada em entidades e relacionamentos já modelados, visando a purificação do modelo de dados existente.
- Sentido Bottom-Up (Baixo para Cima): Utilizada como ferramenta de projeto inicial, baseando-se em relatórios, formulários e documentos da realidade em estudo para constituir o modelo de dados.
É crucial estabelecer um equilíbrio, pois a proliferação excessiva de relações pode impactar negativamente o desempenho global do sistema.
Principais Formas Normais (FNs)
1ª Forma Normal (1FN)
Cada ocorrência da chave primária deve corresponder a uma e somente uma informação de cada atributo. A entidade não deve conter grupos repetitivos.
2ª Forma Normal (2FN)
Aplicada em entidades cuja chave primária é composta (possui mais de um atributo concatenado). Não pode haver atributos com dependência parcial em relação à chave primária.
Exemplo: Ao aplicar a 2FN sobre ITEM-DE-PEDIDO, cria-se a entidade PRODUTO, que herda atributos como Unidade (Und.), Descrição (Desc.) e Valor Unitário (Vl. Unitário), tendo o Código do Produto (Cód. Produto) como chave primária.
3ª Forma Normal (3FN)
Nenhum dos atributos deve possuir dependência transitiva, ou seja, nenhum atributo não-chave deve depender funcionalmente de outro atributo não-chave.
Exemplo: Na entidade PEDIDO, se os atributos Nome do Cliente, Endereço e CPF são dependentes transitivos do atributo Código do Cliente (Cód. Cliente), uma nova entidade CLIENTE deve ser criada, contendo esses atributos e o Cód. Cliente como chave primária.
Forma Normal de Boyce-Codd (FNBC)
A aplicação da FNBC é necessária somente quando três condições ocorrem em conjunto:
- Uma entidade tem várias chaves candidatas.
- As chaves candidatas são concatenadas.
- As chaves candidatas compartilham pelo menos um atributo em comum.
Resumo das Formas Normais e Tipos de Dependência
| Forma Normal | Tipo de Dependência em que se Baseia |
|---|---|
| 1FN | Dependências Funcionais (e Chave Primária) |
| 2FN | Dependência Funcional Parcial |
| 3FN | Dependência Funcional Transitiva |
| FNBC | Dependências Funcionais (e Chaves Candidatas) |
| 4FN | Dependência Multivalorada |
| 5FN ou FNPJ | Dependência de Junção |