Usando o destaque de sintaxe (syntax highlighting) do Vim na padronização de nomenclatura de objetos em banco de dados

O uso do editor Vim faz parte do meu dia-a-dia desde os tempos mais remotos, junto com o Emacs. Por muitas vezes uso o Vim mais nos servidores que conecto e o Emacs localmente. Sempre busco utilizá-los como ferramentas auxiliares para ampliar a minha produtividade.

Quando ao Vim, são muitas as características do Vim que me permitem isso, no entanto uma das que mais gosto é o destaque de sintaxe (do inglês syntax highlighting) que nos permite facilmente visualizar comandos, operadores, identificadores, números e alguns caracteres especiais.

O mais interessante nisso tudo, é que você mesmo pode “melhorar” essa sintaxe, adicionando destaques ou ainda criar o seu próprio arquivo de sintaxe para destacar apenas o texto que você quer e da maneira que você deseja, e é justamente este recurso que trago hoje como destaque e tento demonstrar de maneira didática como ele pode ser um grande aliado na padronização de nomenclaturas de objetos no banco de dados, servindo como o seu editor de arquivos “.sql”.

Não vou aqui explicar em detalhes sobre como montar o arquivo de sintaxe muito menos explicar todos os comandos existentes para construí-lo (até porque isso já é muito bem explicado em outros locais, como em 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16), mas vou ser objetivo e mostrar como eu construí o meu próprio arquivo de sintaxe para satisfazer o padrão de nomenclatura que uso, e assim me “avisar” o que pode estar errado no meu arquivo.

Começando pelo começo - A nomenclatura

Como DBA é possível que você procure seguir um padrão de nomenclatura na criação dos objetos no banco de dados, desta forma você consegue ter uma consistência nos nomes. Por questões didáticas vou expor aqui um exemplo reduzido do padrão de nomenclatura que vou adotar neste post.

Tabelas: os nomes das tabelas iniciam com “TB\_” seguido de um nome descritivo.

Exemplo: TB_NOME_TABELA

Índices: os nomes dos índices iniciam com “IX\_” seguidos do nome descritivo da tabela o qual referencia, e ainda são acrescidos dois dígitos de 01 à 99, pois uma mesma tabela pode conter vários índices.

Exemplo: IX_NOME_TABELA_QUE_REFERENCIA_01

Chaves estrangeiras: os nomes das chaves estrangeiras iniciam com “FK\_” seguidos de um nome descritivo para informar a tabela referenciada e o nome descritivo da tabela o qual pertence, acrescidos de dígitos de 01 à 99, pois mais de uma chave estrangeira pode ser utilizada de uma mesma tabela origem.

Exemplos:

  • FK_NOMETABELAORIGEM_NOMETABELA_01
  • FK_NOMETABELAORIGEM_NOMETABELA_02

E agora o que faço com isso?

Poise bem, se olharmos mais de perto podemos extrair uma expressão regular destes padrões, e é exatamente disso que precisamos para o nosso arquivo de sintaxe - expressões regulares. Claro que o arquivo de sintaxe não é apenas formado por expressões regulares, até porque você tem instruções pré-definidas da linguagem em questão, que não são expressões regulares.

Hummm… acho que entendi… mas me explique melhor?

São 3 as expressões regulares que podemos extrair do padrão acima:

  • Tabelas: "TB_[A-Z_]+"
  • Índices: "IX_[A-Z_]+_[0-9]{2}"
  • Chaves estrangeiras: "FK_[A-Z_]+_[0-9]{2}"

O que vem depois?

Se você não tem um arquivo .vimrc no seu $HOME é hora de criá-lo.

vim #HOME/.vimrc

nele acrescente uma linha com o seguinte comando e salve o arquivo syntax on ele fará com que o vim identifique o tipo de arquivo que está editando (baseado na extensão ou através do comando :set syntax=tipo) e habilite o destaque dos comandos do tipo de arquivo em questão, como xml, python, java, sql e outros.

Agora vamos criar um arquivo de sintaxe que será instanciado por nós no vim quando quisermos, na verdade nós não vamos tocar no arquivo de sintaxe original do sql nem tão pouco estendê-lo mas sim apenas criar uma sintaxe e só chamá-la quando precisarmos.

Se você não possui um diretório .vim em seu $HOME é hora de criá-lo.

mkdir $HOME/.vim

Dentro dele precisamos criar um diretório cujo nome será syntax:

mkdir $HOME/.vim/syntax.

Neste diretório iremos criar um arquivo de sintaxe do vim que chamaremos de meupadraosql.vim

vim $HOME/.vim/syntax/meupadraosql.vim

Tá, mas o que eu digito agora dentro desse arquivo?

Isto:


" Vim syntax file
" Language:	Padrao Pessoal de Sintaxe de Arquivos SQL
" Maintainer:	Dickson S. Guedes
" URL:		http://makeall.wordpress.com
" Lastchange:	2008 Oct 10
"
" Limpa sintaxe existente
syn clear
"
" Os padroes de erro devem vir antes pois serão
" os primeiros a serem destacados em vermelho.
syn match pdrNomeTabelaERRO		'CREATE TABLE .\+'
syn match pdrNomeIndiceERRO 		'CREATE INDEX .\+'
syn match pdrNomeRestricaoERRO		'CONSTRAINT .\+'
"
" Agora vem os padroes que serão destacados em
" azul e devem vir apos o padrao de erro.
syn match pdrNomeTabelaOK		'CREATE TABLE TB_[A-Z_]\+.\+'
syn match pdrNomeIndiceOK 		'CREATE INDEX IX_[A-Z_]\+_[0-9]\{2}.\+'
syn match pdrNomeRestricaoPKOK		'CONSTRAINT PK_[A-Z_]\+.\+'
syn match pdrNomeRestricaoFKOK		'CONSTRAINT FK_[A-Z_]\+_[0-9]\{2}.\+'
"
" Aqui estamos ligando os padroes de erro a um
" padrao de destaque de erro
hi link pdrNomeTabelaERRO		DestacaForaPadrao
hi link pdrNomeIndiceERRO 		DestacaForaPadrao
hi link pdrNomeRestricaoERRO		DestacaForaPadrao
"
" Aqui estamos ligando os padroes corretos a um
" padrao de destaque
hi link pdrNomeTabelaOK			DestacaPadrao
hi link pdrNomeIndiceOK 		DestacaPadrao
hi link pdrNomeRestricaoPKOK		DestacaPadrao
hi link pdrNomeRestricaoFKOK		DestacaPadrao
"
" E aqui associamos o padrão de destaque a uma cor
" de fundo (ctermbg) e uma cor da letra (ctermfg)
hi DestacaForaPadrao 			ctermbg=red  ctermfg=yellow guibg=red guifg=yellow
hi DestacaPadrao			ctermbg=cyan ctermfg=white  guibg=cyan guifg=white
" FIM

E o que eu faço com isto tudo?

Simples! Use o arquivo SQL a seguir como exemplo e veja os resultados obtidos com comandos simples.

  1. Primeiro copie o conteúdo a seguir para um arquivo chamado teste.sql (ou

qualquer outro nome de sua preferência);

--
-- Arquivo de teste de padroes de nomenclatura
--
-- Dickson S. Guedes
--
CREATE TABLE TB_LOCALIDADE (
ID_LOCALIDADE		INT4		NOT NULL,
NOME_CIDADE		VARCHAR(30)	NOT NULL,
NOME_UF			VARCHAR(2)	NOT NULL,
--
CONSTRAINT PH_LOCALIDADE PRIMARY KEY (ID_LOCALIDADE)
);
--
CREATE INDEX IC_LOCALIDADE_01 ON TB_LOCALIDADE (ID_LOCALIDADE);
CREATE INDEX IX_LOCALIDADE_02 ON TB_LOCALIDADE (NOME_UF,NOME_CIDADE);
--
CREATE TABLE TB_PESSOA (
NRO_DOCUMENTO		INT4		NOT NULL,
NOME			VARCHAR(50)	NOT NULL,
SOBRENOME		VARCHAR(50)	NOT NULL,
TELEFONE		VARCHAR(14)	NULL,
CELULAR			VARCHAR(14)	NULL,
ID_LOCALIDADE_NASC	INT4		NOT NULL,
ID_LOCALIDADE_RESID	INT4		NOT NULL,
--
CONSTRAINT PK_PESSOA PRIMARY KEY(NRO_DOCUMENTO),
CONSTRAINT FK_LOCALIDADE_PESSOA_01 FOREIGN KEY (ID_LOCALIDADE_NASC)
REFERENCES TB_LOCALIDADE (ID_LOCALIDADE),
CONSTRAINT FH_LOCALIDADE_PESSOA_02 FOREIGN KEY (ID_LOCALIDADE_RESID)
REFERENCES TB_LOCALIDADE (ID_LOCALIDADE)
);
--
CREATE INDEX IX_PESSOA_01 ON TB_PESSOA (NOME, SOBRENOME);
CREATE INDEX IZ_PESSOA_02 ON TB_PESSOA (TELEFONE);
CREATE INDEX IX_PESSOA    ON TB_PESSOA (CELULAR);
CREATE INDEX IX_PESSOA_04 ON TB_PESSOA (ID_LOCALIDADE_NASC);
  1. Abra o arquivo no vim ou gvim;

  2. Deverá aparecer algo como:

Agora vamos verificar o que tem de errado no nosso arquivo utilizando a sequência (veja que “meupadraosql” nada mais é do que o nome do arquivo que criamos sem a extensão): :set syntax=meupadraosql Automaticamente a aparência de nosso arquivo deverá mudar para algo como:

Voilá! Instantaneamente você consegue identificar o que tem de errado no que diz respeito ao padrão de nomenclatura.

Na verdade, você pode estender esse arquivo e montar seus próprios padrões ou fazê-lo “casar” com os padrões que você queira.

A documentação do vim (e do gvim) é bastante completa, e possui um capítulo inteiro sobre destaque de sintaxe que pode servir como uma excelente fonte. Faça o seu exemplo de padrão também e envie um comentário.

Quer saber mais? Dê uma passeado por estes sites abaixo…

comments powered by Disqus