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á.