Implementando um modelo físico de banco de dados com o ChatGPT 4

Código SQL

Vamos explorar a capacidade da IA generativa de criar código automáticamente, no caso começo pedindo para ele criar código em Transact-SQL que é o dialeto de SQL utilizado pelo Microsoft Server. Estou utilizando o ChatGPT 4. A idéia é criar um projeto físico inicial mas que poderá ser refinado de acordo com a necessidade. A aplicação de gestão de vendas ao varejo é uma aplicação bem conhecida por isso a probabilidade dele gerar com sucesso o módelo físico na primeira tentativa é muito boa. Para aplicações mais específicas e menos conhecidas provávelmente teremos que fornecer a ele maiores informações sobre o módelo lógico, como nome das tabelas, campos de cada tabela e relacionamento entre elas.

Prompt: “Poderia gerar para mim um script de SQL que funcione no SQL Server da Microsoft, que gere tabelas, views e relacionamentos para uma aplicação que gerencie vendas ao varejo, contendo tabela de produtos, categorias, pedidos, ítens de pedidos, fornecedores, vendedores e clientes?”

Resposta: “Vou criar para você um script de SQL básico que atenda à sua solicitação, focado em um sistema de gestão de vendas ao varejo. Este script incluirá a criação de tabelas para produtos, categorias, pedidos, itens de pedidos, fornecedores, vendedores e clientes, além de views e relacionamentos entre essas tabelas. Por se tratar de um exemplo básico, sinta-se à vontade para ajustá-lo conforme as necessidades específicas do seu projeto.”

-- Criação de tabelas
-- Tabela de Categorias
CREATE TABLE Categorias (
    CategoriaID INT PRIMARY KEY IDENTITY,
    Nome VARCHAR(255) NOT NULL,
    Descricao TEXT
);

-- Tabela de Fornecedores
CREATE TABLE Fornecedores (
    FornecedorID INT PRIMARY KEY IDENTITY,
    Nome VARCHAR(255) NOT NULL,
    Contato VARCHAR(255),
    Telefone VARCHAR(50),
    Endereco VARCHAR(255),
    Cidade VARCHAR(100),
    Estado VARCHAR(100),
    Pais VARCHAR(100)
);

-- Tabela de Produtos
CREATE TABLE Produtos (
    ProdutoID INT PRIMARY KEY IDENTITY,
    Nome VARCHAR(255) NOT NULL,
    Descricao TEXT,
    Preco DECIMAL(10, 2) NOT NULL,
    QuantidadeEstoque INT,
    CategoriaID INT,
    FornecedorID INT,
    FOREIGN KEY (CategoriaID) REFERENCES Categorias(CategoriaID),
    FOREIGN KEY (FornecedorID) REFERENCES Fornecedores(FornecedorID)
);

-- Tabela de Clientes
CREATE TABLE Clientes (
    ClienteID INT PRIMARY KEY IDENTITY,
    Nome VARCHAR(255) NOT NULL,
    Email VARCHAR(255),
    Telefone VARCHAR(50),
    Endereco VARCHAR(255),
    Cidade VARCHAR(100),
    Estado VARCHAR(100),
    Pais VARCHAR(100)
);

-- Tabela de Vendedores
CREATE TABLE Vendedores (
    VendedorID INT PRIMARY KEY IDENTITY,
    Nome VARCHAR(255) NOT NULL,
    Contato VARCHAR(255),
    Telefone VARCHAR(50)
);

-- Tabela de Pedidos
CREATE TABLE Pedidos (
    PedidoID INT PRIMARY KEY IDENTITY,
    DataPedido DATETIME NOT NULL,
    ClienteID INT,
    VendedorID INT,
    StatusPedido VARCHAR(50),
    FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID),
    FOREIGN KEY (VendedorID) REFERENCES Vendedores(VendedorID)
);

-- Tabela de Itens de Pedidos
CREATE TABLE ItensPedido (
    ItemPedidoID INT PRIMARY KEY IDENTITY,
    PedidoID INT,
    ProdutoID INT,
    Quantidade INT,
    PrecoUnitario DECIMAL(10, 2),
    FOREIGN KEY (PedidoID) REFERENCES Pedidos(PedidoID),
    FOREIGN KEY (ProdutoID) REFERENCES Produtos(ProdutoID)
);

-- Criação de Views
-- View para resumir informações dos pedidos
CREATE VIEW ResumoPedidos AS
SELECT p.PedidoID, c.Nome AS NomeCliente, v.Nome AS NomeVendedor, p.DataPedido, SUM(ip.Quantidade * ip.PrecoUnitario) AS TotalPedido
FROM Pedidos p
JOIN Clientes c ON p.ClienteID = c.ClienteID
JOIN Vendedores v ON p.VendedorID = v.VendedorID
JOIN ItensPedido ip ON p.PedidoID = ip.PedidoID
GROUP BY p.PedidoID, c.Nome, v.Nome, p.DataPedido;

-- Ajuste os tipos de dados e estruturas conforme necessário.

“Este script SQL é um ponto de partida. Dependendo das necessidades específicas da sua aplicação, você pode precisar de ajustes, como a adição de colunas para endereços mais detalhados, gestão de estoques mais complexa, regras de negócio na forma de triggers ou procedimentos armazenados, e índices para otimização de consultas.”

A View que ele gerou é muito interessante e importante para o modelo. Ela permite visualizar os dados dos pedidos incluindo o valor total do pedido, informação obtida fazendo um relacionamento com a tabela de ítens de pedidos.

O SQL Server me permite criar procedimentos armazenados ou “stored procedures” , então vou escrever um prompt pedindo para ele gerar o código em sql para criação de stored procedures para inclusão / alteração / exclusão de registros, por exemplo para a tabela pedidos, mas caso tenha sucesso posso repetir o prompt para as outras tabelas.

Prompt: Favor criar stored procedures para realizar a inclusão, alteração e exclusão de registros da tabela de Pedidos.

Resposta: “Claro! Vou criar três stored procedures para você: uma para inserção, outra para atualização e uma terceira para exclusão de registros na tabela de Pedidos no SQL Server. Essas stored procedures facilitarão a manipulação de dados de pedidos em sua aplicação.”

1. Stored Procedure para Inserir um Novo Pedido

CREATE PROCEDURE spInserirPedido
    @DataPedido DATETIME,
    @ClienteID INT,
    @VendedorID INT,
    @StatusPedido VARCHAR(50)
AS
BEGIN
    INSERT INTO Pedidos (DataPedido, ClienteID, VendedorID, StatusPedido)
    VALUES (@DataPedido, @ClienteID, @VendedorID, @StatusPedido);
END;
GO

2. Stored Procedure para Atualizar um Pedido Existente

CREATE PROCEDURE spAtualizarPedido
    @PedidoID INT,
    @DataPedido DATETIME,
    @ClienteID INT,
    @VendedorID INT,
    @StatusPedido VARCHAR(50)
AS
BEGIN
    UPDATE Pedidos
    SET DataPedido = @DataPedido,
        ClienteID = @ClienteID,
        VendedorID = @VendedorID,
        StatusPedido = @StatusPedido
    WHERE PedidoID = @PedidoID;
END;
GO

3. Stored Procedure para Excluir um Pedido

CREATE PROCEDURE spExcluirPedido
    @PedidoID INT
AS
BEGIN
    DELETE FROM Pedidos
    WHERE PedidoID = @PedidoID;
END;
GO

Como Usar

  • Para inserir um novo pedido, você chamaria a stored procedure spInserirPedido passando os valores necessários para cada parâmetro (exceto o PedidoID, que é gerado automaticamente):
EXEC spInserirPedido '2024-03-22', 1, 1, 'Em Processamento';
  • Para atualizar um pedido existente, você usaria a spAtualizarPedido, especificando o ID do pedido junto com os novos valores para os campos que deseja atualizar:
EXEC spAtualizarPedido 1, '2024-03-22', 1, 1, 'Concluído';
  • E para excluir um pedido, simplesmente forneça o ID do pedido à spExcluirPedido:
EXEC spExcluirPedido 1;

“Lembre-se de ajustar os tipos de dados e os nomes das colunas conforme necessário para se adequar ao esquema exato da sua tabela de Pedidos.”

O ChatGPT gerou as stored procedures solicitadas com sucesso. Mas um detalhe que lembrei me incomodou: geralmente no ambiente corporativo nós não excluimos os registros de fato das tabelas, essas informações ficam para uma possível recuperação ou consulta futura. Então vou pedir para ele leva a consideração a existencia de um campo “ativo”, cujo valor padrão seria 1 e caso o registro tenha sido “excluido” o valor seria 0, criar uma nova versão da stored procedure de exclusão para em vez de excluir o registro, apenas atualizar o valor do campo “ativo” para o valor 0.

Prompt: “Considerando uma modificação da tabela Pedidos na qual se incluiu um novo campo chamado de “ativo” cujo valor padrão será 1, caso o registro esteja ativo e o valor será 0 caso o registro tenha sido executado pela stored procedure spExcluirPedido, favor gerar uma nova versão da stored procedure que em vez de excluir o registro da tabela Pedidos apenas atualize o valor do campo ativo para o valor 0.”

Resposta: Para acomodar a alteração na tabela Pedidos com a adição do campo ativo, ajustarei a stored procedure spExcluirPedido para que, ao invés de excluir um registro, ela atualize o campo ativo para 0, marcando o pedido como inativo. Aqui está a nova versão da stored procedure:

ALTER PROCEDURE spExcluirPedido
    @PedidoID INT
AS
BEGIN
    UPDATE Pedidos
    SET ativo = 0
    WHERE PedidoID = @PedidoID;
END;
GO

“Com essa alteração, a operação de “exclusão” de um pedido na tabela Pedidos agora apenas marcará o pedido como inativo, sem remover o registro do banco de dados. Isso permite que você mantenha um histórico de pedidos, mesmo aqueles que foram “excluídos”, e pode ser útil para análises futuras ou para manter registros por questões de conformidade.”

“Para garantir que esta stored procedure funcione conforme esperado, você precisará adicionar o campo ativo à tabela Pedidos, caso ainda não tenha feito. Aqui está como você poderia fazer essa alteração:

ALTER TABLE Pedidos
ADD ativo BIT DEFAULT 1 NOT NULL;

Este comando adiciona a coluna ativo à tabela Pedidos com um valor padrão de 1 (indicando que o pedido está ativo). Quando a stored procedure spExcluirPedido for executada, ela agora atualizará esse campo para 0 para o pedido especificado, marcando-o como inativo.”

Perfeito! Podemos pedir para ele fazer a mesma alteração na estrutura das outras tabelas e nas stored procedures de exclusão correspondentes. Na View gerada também teria que ser feita uma modificação para selecionar apenas os registros da tabela Pedidos com o campo “ativo” igual a 1. Mas já está de bom tamanho, já deu para ver o que ele é capaz de fazer para nós. A nossa participação para ajudar a criar a implementação final também foi importante, trabalhamos em conjunto com ele.

Um observação importante é que embora tenhamos criado código em Transact-SQL, o dialeto de SQL utilizado pelo SQL Server podemos pedir para o ChatGPT para escrever uma versão dos scripts em SQL gerados para outro gerenciador de banco de dados, como o Oracle ou MySQL por exemplo. Ele fará isso rápidamente.

Espero que tenham gostado, poderiamos estender o modelo para criar outro tipo de Views que considerassemos necessárias para nossa aplicação. Vai depender de nossa necessidade.

Autor: Ernesto Villafuerte Oyola

Mestre em Ciências de Computação – Inteligência Artificial

COPPE/UFRJ

Diretor da Aomega Treinamento e Consultoria www.aomega.com.br

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *