Artigos em Destaque

Prevenir a utilização de SELECT * 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...

Read more

Olá, mundo!Olá, mundo! Olá pessoal!! Este é o meu primeiro post aqui para o meu cubículo. É um bom motivo de comemoração... Bem, só espero que os posts comecem a ser cada vez mais e com mais frequência. Os temas...

Read more

Prevenir a utilização de “SELECT *”

Publicado por admin | Colocado em Informática, SQL | Publicado em 12 Nov 2009

Tags:,

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
);
GO

INSERT INTO dbo.Tabela (Coluna1)
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5;
GO

DENY 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 Tabela

O 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 :D

Até à próxima, que espero que seja em breve.

Olá, mundo!

Publicado por admin | Colocado em Vários | Publicado em 04 Nov 2009

Tags:

0

Olá pessoal!!

Este é o meu primeiro post aqui para o meu cubículo. É um bom motivo de comemoração…

Bem, só espero que os posts comecem a ser cada vez mais e com mais frequência. Os temas serão vários e de temas diversos, principalmente sobre informática (por ser a minha área de trabalho ;) ) e as minhas vivências no mundo real.

Pelo menos prometo que vou tentar que a minha presença seja mais assídua.

Façam é o favor de comentar, para fazer críticas boas e más, claro.

Até à próxima. Abraço.