sábado, 6 de novembro de 2010

SELECT * em Views

É muito comum utilizar SELECT * na criação de views, mas uma simples inclusão de uma coluna na tabela referenciada na view pode acarretar um problema. Vamos praticar e vou explicando os detalhes…
Primeiro passo, criar um banco de testes…

IF DB_ID('TesteView') IS NOT NULL
DROP DATABASE TesteView;
 
CREATE DATABASE TesteView;
GO
 
Neste ponto vamos criar uma tabela e inserir registros…
 
CREATE TABLE Numeros
(
col1 INT NOT NULL,
col2 INT NOT NULL
)
 
INSERT INTO dbo.Numeros(col1, col2) VALUES (1,100);
INSERT INTO dbo.Numeros(col1, col2) VALUES (2,200);
INSERT INTO dbo.Numeros(col1, col2) VALUES (3,300);
INSERT INTO dbo.Numeros(col1, col2) VALUES (4,400);
 

Verificando se os registros foram incluidos com sucesso..

SELECT col1, col2 FROM dbo.Numeros;
 
select_asterisco_em_views_01
 
O próximo passo é a criação da view. Atente para o fato do SELECT não definir as colunas que desejamos utilizar, e sim usar *.
 
CREATE VIEW VisaoNumeros
AS
    SELECT * FROM dbo.Numeros;
GO
 
Vamos fazer um SELECT usando a view recem criada…

SELECT * FROM dbo.VisaoNumeros
 
E o resultado…
 
select_asterisco_em_views_01 
Neste ponto vamos incluir uma coluna a tabela:

ALTER TABLE Numeros ADD col3 INT
 
Um SELECT para confirmar que as 3 colunas existem na tabela…

SELECT * FROM dbo.Numeros;
 
select_asterisco_em_views_02 
 
Agora, SELECT usando a view…

SELECT * FROM dbo.VisaoNumeros;
 
select_asterisco_em_views_03
 
Vamos notar que mesmo utilizando o *, a view retornou apenas as 2 colunas já existentes na tabela antes da criação da View. A coluna criada após a view não é apresentada… E agora? Existe uma stored procedure que realiza uma atualização (refresh) na view desejada. Executando a stored procedure… 

EXEC sp_refreshview @viewname = 'dbo.VisaoNumeros';
 
Pronto! Podemos agora realizar novamente o SELECT * na view desejada..

SELECT * FROM dbo.VisaoNumeros;
 
E o resultado…
 
select_asterisco_em_views_04

Nenhum comentário:

Postar um comentário