Posts Tagged ‘metadados’

Verificando a existência de objetos

Posted in Vida Real on August 21st, 2009 by Silas Mendes – Be the first to comment

Uma necessidade comum de muitos desenvolvedores é verificar a existência de objetos no banco de dados. Então vou fazer aqui uma rapidinha com exemplos bem básicos, pras situações mais comuns, vamos lá:

A tabela tb_Pedido existe no banco?

use [meuBanco]

GO

if exists

(select * from information_schema.tables where table_name = ‘tb_pedido’)

print ‘Tabela existe’

else

print ‘Tabela não existe’

 

Quais tabelas no banco possuem a coluna cod_cliente?

use [meuBanco]

GO

select table_name, data_type

from information_schema.columns

where column_name = ‘cod_cliente’

 

A coluna cod_cliente existe na tabela tb_Pedido? Se não existe, adicionar:

use [meuBanco]

GO

if exists

(select * from information_schema.columns

where table_name = ‘tb_pedido’ and column_name = ‘cod_cliente’)

 print ‘Coluna existe.’

else

alter table tb_pedido add cod_cliente int


Observe que nos três exemplos acima, utilizamos as seguintes views de metadados:

  • information_schema.tables – que apresenta diversas informações sobre as tabelas de um banco.
  • information_schema.columns – que apresenta informações sobre as colunas, das tabelas de um banco.

Ok, mas afinal o que são METADADOS?

A definição mais comum é: informação sobre os dados. Esta definição não é muito amigável, eu sei, mas o que você precisa saber é que todos os objetos que você cria no banco, como tabelas, procedures, índices, etc, tem suas informações armazenadas em tabelas de sistema do SQL Server e as views utilizadas neste post buscam esses dados nas tabelas de sistema.

Comentaremos mais sobre metadados em outro posts, mas se você deseja se aprofundar no assunto, dê uma estudada neste link.

Até +

Consultando objetos do banco

Posted in Vida Real on September 2nd, 2008 by Silas Mendes – Be the first to comment

 

Durante o processo de desenvolvimento é comum realizar consultas a metadados, ou seja, consultas que retornam informações sobre o próprio banco; algo como a consulta abaixo,  que retorna todas as tabelas de um determinado banco, junto com o nome de suas colunas e o tipo de dados:

SELECT

t.name nome_tabela,

c.name nome_coluna,

ty.name tipo_dado

FROM

sysobjects t, syscolumns c, systypes ty

WHERE

t.id = c.id AND

t.type = ‘U’ AND

c.xtype = ty.type

 

Isto está errado?

Não.

No entanto não é uma boa prática realizar consultas diretamente nas tabelas de sistema. Além do esforço em entender a estrutura dessas informações e construir a query, existe a possibilidade de no futuro a Microsoft descontinuar ou alterar a estrutura de umas dessas tabelas. E aí? O que acontece com sua aplicação que estava buscando dados naquela estrutura?

Para evitar esse tipo de problemas, a partir da versão 7 do Microsoft SQL Server surgiram as Information Schema Views, um catálogo de views de metadados desenvolvidas de acordo com padrões ISO, onde a idéia é que os dados serão retornados, independente da versão do SQL Server, logo se houverem mudanças nas tabelas de sistema, sua aplicação não será afetada porque ela está buscando dados de uma view, além disso, a forma de consulta é muito simples. Veja:

Se você quer obter os mesmos dados da consulta acima utilizando uma dessas views, precisa somente disto:

SELECT

TABLE_NAME, COLUMN_NAME, DATA_TYPE

FROM

INFORMATION_SCHEMA.COLUMNS

 

Veja como é mais simples.

Quer consultar todas as tabelas de sua base que comecem com tb_pedido? Então tente isso:

SELECT

TABLE_NAME

FROM

INFORMATION_SCHEMA.TABLES

WHERE

TABLE_NAME like ‘tb_pedido%’

 

 

Se quiser consultar todas as procedures que iniciam com ‘listar%’ utilize:

SELECT

*

FROM

INFORMATION_SCHEMA.ROUTINES

WHERE

SPECIFIC_NAME like ‘listar%’ and ROUTINE_TYPE = ‘PROCEDURE’

 

Além destas existem outras views que podem te auxiliar na consulta a metadados. Veja uma  lista completa aqui.

Bom trabalho!