[SQL Server] Exame 70-461 – Tópico 3: Projetando Views – Parte 2 – Final

[SQL Server] Exame 70-461 – Tópico 3: Projetando Views – Parte 2 – Final

Dando sequência aos estudos do tópico Projetando Views, vamos abordar o assunto Implicações de Segurança.

Implicações de Segurança

Um dos benefícios ao se utilizar views é a camada de abstração de segurança que nos é proporcionada. Um usuário pode receber um grant de select em uma view, sem a necessidade de receber o mesmo grant de select nas tabelas base referenciadas. Isso significa que o usuário consegue fazer select na view, mas não consegue fazer select nas tabelas usadas pela view. Além disso, views é uma forma de implementar segurança tanto em coluna quanto em linha. É possível no SQL Server dar grant’s em colunas específicas de determinada tabela, mas não diretamente nas linhas. Imagine um cenário em que o DBA é requisitado a configurar as seguintes permissões para o usuário Pedro:

A) Visualizar e ler o conteúdo das colunas Código, Nome e CPF da tabela Cliente;

B) Ler apenas as linhas cuja coluna SALARIO seja inferior a R$ 1.000,00.

O primeiro requisito é fácil de ser atendido e, para isso, o grant de select poderia ser setado diretamente nas colunas da tabela. Contudo, para o segundo requisito não existe um “tipo de grant” e, desta forma, precisamos recorrer a uma abordagem que implemente ambos os requisitos numa única “tacada”. Vejamos como.

 

use DBExame70461
go

— Se a tabela Cliente existir então vamos dropá-la
IF OBJECT_ID(‘dbo.Cliente’) IS NOT NULL
DROP TABLE dbo.Cliente;

— Criando a tabela CLIENTE
CREATE TABLE dbo.Cliente
( Codigo INT NOT NULL IDENTITY PRIMARY KEY,
Nome varchar(50) NOT NULL,
Sexo CHAR(1) NOT NULL,
Telefone CHAR(8) NOT NULL,
CPF CHAR(11) NOT NULL,
SALARIO DECIMAL(10,2) NOT NULL);
GO

— Inserindo duas linhas
INSERT INTO dbo.Cliente (Nome, Sexo, Telefone, CPF, Salario)
VALUES (‘Maria’, ‘F’, ‘12345678’, ‘00000000000’, 560.50);

INSERT INTO dbo.Cliente (Nome, Sexo, Telefone, CPF, Salario)
VALUES (‘Joana’, ‘F’, ‘12345678’, ‘11111111111’, 2300.44);
GO

IF OBJECT_ID(‘dbo.vwClientes’) IS NOT NULL
DROP VIEW dbo.vwClientes;
GO

— Criando a view
CREATE VIEW dbo.vwClientes
AS
SELECT c.Codigo, c.Nome, c.CPF
FROM dbo.Cliente c
WHERE c.SALARIO < 1000.00
GO

 

Até neste ponto temos o nosso cenário construído. Agora vamos criar um usuário de banco e conceder grant de select sobre a view. Não se preocupem especificamente com as instruções de criação e gerenciamento de usuário, pois as mesmas estão fora do escopo do exame 70-461.

 

— Criando um usuário de banco de nome Pedro
CREATE USER Pedro WITHOUT LOGIN;

— Concedendo o GRANT de SELECT para Pedro
GRANT SELECT ON dbo.vwClientes TO Pedro;

 

/*
Neste momento estou alterando o contexto de segurança da sessão e
assumindo a identidade do usuário Pedro
*/
EXECUTE AS USER = ‘Pedro’;

 

/*
Veja que Pedro não consegue fazer um select
diretamente na tabela Cliente
*/
SELECT * FROM dbo.Cliente;

image

 

— Pedro consegue consultar a view vwClientes
SELECT * FROM dbo.vwClientes;

image

Conclusão

No próximo post estarei quebrando a sequência de tópicos do exame para atender a um pedido dos leitores que vêm acompanhando esta série: apresentar uma lista de material de estudo complementar. Vou elencar os tópicos e apontar fontes de estudo para cada um. Até lá.



Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s