Prevenir a utilização de “SELECT *”
Publicado por admin | Colocado em Informática, SQL | Publicado em 12 Nov 2009
Tags:Informática, SQL
0
Tal como é sabido, a utilização de “SELECT *” é muito pouco vantajosa, ou até nada. Muitos dos Administradores de Bases de Dados aconselham os programadores a nunca os utilizar nas suas queries.
O grande problema prende-se com o facto de ser muito difícil de proibir estas situações. Porém, é possível.
De seguida é explicada uma forma trivial de conseguir atingir este objectivo.
Criamos um novo utilizador para a base de dados chamado UtilizadorTeste.
USE MASTER
GO
CREATE LOGIN UtilizadorTeste WITH PASSWORD = 'passwordUtilizadorTeste';
GO
CREATE DATABASE NegarSelectAsterisco;
GO
USE NegarSelectAsterisco
GO
CREATE USER UtilizadorTeste FROM LOGIN UtilizadorTeste WITH DEFAULT_SCHEMA = NegarSelectAsterisco;
GO
EXEC sp_addrolemember N'db_datareader', N'UtilizadorTeste'
GO
Depois criamos uma tabela chamada Tabela com 3 colunas, nomeadamente ID_Chave, Coluna1 e ColunaXPTO. A chave primária da tabela é ID_Chave.
Um aspecto importante é que se deve negar a permissão de SELECT ao utilizador criado anteriormente. Da seguinte forma:
CREATE TABLE dbo.Tabela(
ID_Chave INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
,Coluna1 INT NULL
,ColunaXPTO CHAR(1) NULL
);
GOINSERT INTO dbo.Tabela (Coluna1)
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5;
GODENY SELECT ON OBJECT:: dbo.Tabela(ColunaXPTO) TO UtilizadorTeste;
GO
Para fazer agora um pequeno teste, pode-se abrir uma nova janela para executar a seguinte query.
SELECT *
FROM TabelaO resultado, tal como esperado, será o seguinte:
--Result
Msg 230, Level 14, State 1, Line 1
The SELECT permission was denied on the column 'DummyColumn' of the object 'Table_1", database 'DenySelectStar', schema 'dbo'.
A query a executar, para ver as linhas todas da tabela, deve ser executado o seguinte:
SELECT ID_Chave, Coluna1
FROM dbo.Tabela;
Mas, analisando esta abordagem ao pormenor pode-se verificar que tem uma pequena (ou grande, depende do ponto de vista
) desvantagem.
Caso se pretenda realizar a seguinte query não será possível. O resultado será o mesmo que o apresentado na query anterior.
SELECT COUNT(*) FROM dbo.Tabela;
SELECT COUNT(1) FROM dbo.Tabela;
Para “dar a volta” a este problema basta substituir o “*” ou o “1″ por ID_Chave. O resultado será o aquele que seria esperado pela query anterior.
Concluindo… percebo perfeitamente que seja uma abordagem que resulte em muito trabalho, mas se o objectivo requerido for mesmo a proibição do uso do “SELECT *” então aqui têm uma forma de o conseguir.
Ah, já me esquecia… para se apagarem todas os dados de teste criados anteriormente executem o seguinte script.
USE MASTER
GO
DROP DATABASE DenySelectStar;
GO
DROP LOGIN test_user;
GO
Espero que tenham gostado
Até à próxima, que espero que seja em breve.


