Problema:
De tempos em tempos, como administrador de banco de dados ou desenvolvedor, você pode ser chamado para solucionar e diagnosticar problemas de banco de dados. Um desafio comum é identificar se foram feitas alterações nas tabelas do banco de dados ou no código-fonte do banco de dados desde a sua criação. Isso pode levar a um desperdício de tempo investigativo e frustração.
Solução:
Para rastrear e identificar facilmente quaisquer alterações feitas em um banco de dados do SQL Server, você pode criar suas próprias “tabelas de sistema” que descrevem os objetos em seu banco de dados. Ao manter essas tabelas personalizadas e compará-las com as visualizações INFORMATION_SCHEMA do SQL Server, você pode identificar rapidamente quaisquer diferenças e rastrear as alterações no banco de dados.
Aqui está um exemplo de como você pode implementar essa solução:
-- Crie tabelas personalizadas para armazenar informações sobre tabelas e procedimentos armazenados
CREATE TABLE dbo.MinhasTabelas (
nome_tabela VARCHAR(50) NOT NULL,
nome_coluna VARCHAR(50) NOT NULL
)
CREATE UNIQUE CLUSTERED INDEX uq_MinhasTabelas ON dbo.MinhasTabelas (nome_tabela, nome_coluna)
CREATE TABLE dbo.MeusProcs (
nome_proc VARCHAR(255) NOT NULL,
tamanho_proc INT NOT NULL
)
CREATE UNIQUE CLUSTERED INDEX uq_MeusProcs ON dbo.MeusProcs (nome_proc)
-- Crie uma tabela de exemplo
CREATE TABLE dbo.Cliente (
id_cliente INT IDENTITY(1, 1) NOT NULL,
primeiro_nome VARCHAR(255) NOT NULL,
ultimo_nome VARCHAR(255) NOT NULL
)
-- Crie um procedimento armazenado de exemplo
CREATE PROCEDURE dbo.ObterCliente
AS
SET NOCOUNT ON
SELECT primeiro_nome, ultimo_nome FROM dbo.cliente
-- Preencha as tabelas personalizadas com informações sobre os objetos no banco de dados
INSERT INTO dbo.MinhasTabelas (nome_tabela, nome_coluna)
SELECT 'Cliente', 'id_cliente' -- id_cliente
INSERT INTO dbo.MinhasTabelas (nome_tabela, nome_coluna)
SELECT 'Cliente', 'primeiro_nome' -- primeiro_nome
INSERT INTO dbo.MinhasTabelas (nome_tabela, nome_coluna)
SELECT 'Cliente', 'ultimo_nome' -- ultimo_nome
INSERT INTO dbo.MeusProcs (nome_proc, tamanho_proc)
SELECT 'ObterCliente', 282 -- o tamanho do procedimento
-- Crie um procedimento de verificação para comparar as tabelas personalizadas com as visualizações INFORMATION_SCHEMA
CREATE PROCEDURE dbo.VerificarMeuBancoDeDados
AS
SET NOCOUNT ON
CREATE TABLE #tabela (nome_tabela VARCHAR(50))
CREATE TABLE #proc (nome_proc VARCHAR(255))
-- Verifique se todas as tabelas estão presentes
INSERT INTO #tabela (nome_tabela)
SELECT nome_tabela FROM dbo.MinhasTabelas db
WHERE NOT EXISTS (
SELECT 1 FROM INFORMATION_SCHEMA.TABLES i
WHERE i.TABLE_NAME = db.nome_tabela AND i.TABLE_TYPE = 'BASE TABLE'
)
IF EXISTS (SELECT 1 FROM #tabela)
BEGIN
PRINT 'Tabelas ausentes!'
PRINT '----------------'
SELECT nome_tabela FROM #tabela
END
ELSE
PRINT 'Todas as tabelas estão presentes'
-- Verifique se os procedimentos foram alterados
INSERT INTO #proc (nome_proc)
SELECT nome_proc FROM dbo.MeusProcs db
INNER JOIN INFORMATION_SCHEMA.ROUTINES i ON i.ROUTINE_NAME = db.nome_proc
AND i.ROUTINE_TYPE = 'PROCEDURE'
AND DATALENGTH(OBJECT_DEFINITION(OBJECT_ID(ROUTINE_NAME))) <> db.tamanho_proc
IF EXISTS (SELECT 1 FROM #proc)
BEGIN
PRINT 'Os seguintes procedimentos podem ter sido alterados'
PRINT '-----------------------------------------'
SELECT nome_proc FROM #proc
END
ELSE
PRINT 'Todos os procedimentos armazenados parecem consistentes'
-- Execute o procedimento de verificação
EXEC VerificarMeuBancoDeDados
Ao executar o procedimento VerificarMeuBancoDeDados
, você pode identificar facilmente quaisquer alterações que ocorreram no banco de dados. Por exemplo, se um desenvolvedor modificar o procedimento armazenado ObterCliente
para aceitar um ID de cliente passado, executar novamente o procedimento de verificação do banco de dados capturará que algo foi alterado no banco de dados.
Rastrear alterações no banco de dados dessa maneira pode economizar muito tempo investigativo desperdiçado e ajudá-lo a identificar rapidamente a causa de quaisquer problemas que possam surgir.
Lembre-se de atualizar regularmente suas tabelas personalizadas à medida que novos objetos são adicionados ou modificados no banco de dados para garantir o rastreamento preciso das alterações.
A implementação dessa abordagem pode melhorar significativamente sua capacidade de solucionar e diagnosticar problemas de banco de dados, tornando você um profissional mais eficiente e eficaz do SQL Server.