O assunto desta vez é a geração de scripts que se apliquem a múltiplos bancos de dados.
É claro que scripts que afetam toda instância SQL são muito poderosos, mas é sempre bom lembrar que quanto mais amplo o escopo do seu script, maiores devem ser os cuidados na sua construção.
Tendo isso em mente, começamos a conversa falando dos tipos de tabelas de sistema.
LEIA TAMBÉM: Scripts SQL e Tabelas de Sistema – Parte 1: Alterando Colunas
Scripts SQL – Tipos de Tabelas de Sistema
Estou sempre me referindo a estes catálogos como “tabelas de sistema”, mas muitos deles são visões ou até mesmo exibições de gerenciamento dinâmico do sistema (que englobam as DMVs e DMFs).
De qualquer modo, para fins de criação de um gerador de scripts, não importa que tipo de objeto que se está usando. Basta saber como trabalhar com seus metadados.
Já apresentei algumas tabelas de sistema nos artigos anteriores, mas o ponto importante é que aquelas tabelas existem em todos os bancos de dados da instância, sejam eles bancos de sistema (MASTER, TEMPDB, MSDB, MODEL) ou de usuário.
Outros catálogos são específicos de uma ou outra base de sistema.
Por exemplo, na base MASTER, existem algumas tabelas extras que só são encontradas ali. Por exemplo:
- sys.databases : contém informações de todas as bases de dados (veja link).
- sys.servers : informa metadados dos servidores vinculados (“linked servers”)
- sys.logins : traz informações de todos os logins cadastrados na instância SQL
- sys.master_files : metadados dos arquivos de dados e log usados em cada base de dados (“datafiles”)
Do mesmo modo, na base MSDB existem tabelas que tratam de metadados dos jobs da instância, seus passos, agendamentos etc.
Caso de Uso
Neste exemplo, apresento um script simples para ajudar o administrador da instância a controlar o consumo excessivo de espaço em disco por parte dos arquivos de log.
Originalmente, eu criei este script para lidar com um caso real, onde o ambiente de testes da empresa dispunha de uma quantidade limitada de espaço para os arquivos de log.
O objetivo deste script é identificar quais arquivos de log estão ocupando mais espaço do que o esperado e então tentar liberar espaço livre destes arquivos.
Para isso, eu uso a instrução DBCC SHRINKFILE. Importante lembrar que para executar esta operação é necessário fazer parte do grupo de segurança sysadmin ou então do grupo db_owner de cada um dos bancos de dados afetados.
Definindo Escopo
Para encontrar os metadados necessários para esta tarefa, eu uso duas tabelas de sistema específicas da base MASTER:
- sys.databases
- sys.master_files
O Quadro 1 mostra a consulta para identificar o tamanho dos arquivos de log das bases de dados de usuário que tiverem status “online”.
LEIA TAMBÉM: Scripts SQL e Tabelas de Sistema – Parte 2: Criando Índices
Construindo o Gerador de Scripts de Gerenciamento de Log
Agora eu reutilizo a consulta anterior para criar o gerador de scripts e adiciono duas variáveis para especificar qual o tamanho limite dos arquivos que sofrerão a redução e qual o tamanho que será reservado para eles. Veja o Quadro 2.
Observe no quadro acima que o resultado da consulta foi exibido em modo texto, exatamente para exibir as novas “linhas” que fazem parte do script. Basta agora copiar estas declarações e executá-las no seu ambiente.
Você pode fazer o download do script completo neste link.
Scripts SQL – Comentários Finais
Neste artigo, trago um exemplo bem simples de uso de geradores de scripts que afetam múltiplos bancos de dados.
O exemplo foi escolhido a dedo, visto que o nível de complexidade do gerador de scripts aumenta muito quando se trata de criar ações que vão afetar objetos internos de múltiplas bases de dados.
Um exercício que demonstraria esta afirmação (e fica como sugestão para o leitor) seria converter os scripts dos artigos anteriores para serem executados em todos os bancos de dados da instância.
No quarto artigo dessa série, trarei um novo exemplo que exatamente isso: inspeciona cada uma das bases e toma ações dentro de cada uma delas.
Até a próxima!