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:

  1. Uma entidade tem várias chaves candidatas.
  2. As chaves candidatas são concatenadas.
  3. As chaves candidatas compartilham pelo menos um atributo em comum.
Resumo das Formas Normais e Tipos de Dependência
Forma NormalTipo de Dependência em que se Baseia
1FNDependências Funcionais (e Chave Primária)
2FNDependência Funcional Parcial
3FNDependência Funcional Transitiva
FNBCDependências Funcionais (e Chaves Candidatas)
4FNDependência Multivalorada
5FN ou FNPJDependência de Junção

Entradas relacionadas: