Vem aí HANDS ON SQL SERVER 2012

Conheça as novidades e melhorias da versão 2012 do SQL Server. Fique por dentro das novas funcionalidades administrativas e dos novos recursos de programação T-SQL. Explore a nova suíte de Business Intelligence do SQL Server e descubra o poder das ferramentas de self-service BI da Microsoft.

Em janeiro de 2013.

clip_image002

Conteúdo Programático

Novidades e Melhorias Administrativas

– Contained Databases

– FileTable

– User Defined Server Roles

– Default Schema for Windows Groups

– User Defined Audit

– Melhorias no XE – Extended Events

– Instalação em Windows Server Core

– Database Recovery Advisor

 

Novidades em Alta Disponibilidade

– AlwaysOn Availability Groups

 

Novidades T-SQL

– Sequences

– Novo recurso para paginação de consultas: OFFSET..FETCH NEXT

– Novas funções analíticas FIRST_VALUE, LAST_VALUE, LEAD e LAG

– Novas Strings Functions

– Throw Statement

– Statistical Semantic Search

 

Novidades em Business Intelligence

– Principais melhorias do Reporting Services

– Analysis Services Tabular Model

– Self-Service BI com Power Pivot e Power View

– Novas tecnologias Microsoft para Big Data: o que vem por aí!

Investimento: HANDS ON SQL SERVER 2012 – R$ 200,00 – Pessoa Física ou Jurídica: à vista.

Local: Centro de Treinamentos da Mindworks – Rua José Alexandre Buaiz, 160, Ed. London Office Tower, sala 424, Enseada do Suá – Vitória – ES (próximo ao Shopping Vitória – Em frente ao Tribunal de Contas)

Data de inicio:

Noturno das 18h30 às 22h30

07 e 08  Janeiro;

21 e 22 Janeiro;

23 e 24 Janeiro.

Sábado das 09h às 17h

26 de Janeiro

 

Falar com Fabiola Morais

(27)3015-1825

fabiola@mindworks.com.br


Manutenção « SQL From Hell.com

http://sqlfromhell.wordpress.com/category/manutencao/


[SQL Server] Exame 70-461 – Tópico 4: Criando e Modificando Constraints – Parte 01

Um importante passo, que faz parte do projeto de um banco de dados, é decidir a melhor maneira de como forçar e garantir a integridade dos dados. A integridade pode ser forçada completa e unicamente na camada de aplicação, ou exclusivamente no nível da camada de dados (leia-se banco de dados), ou, ainda, através de uma abordagem híbrida (esta é a abordagem mais comumente utilizada). Discussões e polêmicas à parte, existe um mínimo de “coisas” que você deveria implementar na camada de banco, visando garantir a integridade. Iremos falar sobre isso no decorrer deste post.

Tipos de Integridade de Dados

Conceitualmente existem três tipos de integridade de dados, conforme ilustra a figura abaixo.

image

· Integridade de domínio (coluna): especifica o conjunto de valores válidos para uma determinada coluna, bem como se a coluna aceita nulo ou não.

· Integridade de entidade (linha): requer que cada linha seja identificada de forma única na tabela, ou seja, cada linha possui uma identificação exclusiva. Isto é normalmente chamado de chave primária (primary key).

· Integridade referencial (entre tabelas): mantém um relacionamento consistente entre a Tabela A e a Tabela B. A chave primária da Tabela A existe como uma coluna na Tabela B, onde é conceitualmente chamada de chave-estrangeira. Desta forma, não será possível inserir um valor na coluna chave-estrangeira da Tabela B que não exista na coluna chave-primária da Tabela A. Por exemplo, não será possível inserir na tabela de Vendas o código de um cliente que não exista na tabela de Clientes.

Dentro do SQL Server temos as seguintes opções para forçar e garantir a integridade de dados:

Tipo de dados Define o tipo de dados que a coluna pode armazenar. Exemplo: DATETIME2
Nulidade Determina se ou não um valor deve estar presente em uma coluna
Constraints Define regras que limitam o conjunto de valores que podem ser armazenados em uma coluna ou, no nível da tabela, como os valores em diferentes colunas estão relacionados
Triggers Define um código que é executado automaticamente quando uma tabela é modificada. Através disso podemos aplicar restrições de valores e, inclusive, regras de negócio, dentre outras coisas.

Nulidade de Coluna (NULL / NOT NULL)

Este mecanismo permite forçar a integridade de domínio. Ele define se uma coluna é obrigatória. Existem muitas bases de dados legadas por aí cuja questão da nulidade fica completamente a cargo da aplicação, enquanto que nas tabelas todas as colunas estão setadas para aceitar nulo. Este tipo de design é um risco!

Vejamos como implementar a nulidade em tabelas utilizando as opções NULL e NOT NULL. Neste ponto estou destruindo e recriando o banco DBExame70461.

use master
GO

if db_id('DBExame70461') IS NOT NULL
BEGIN
    alter database DBExame70461 set single_user with rollback immediate;
    drop DATABASE DBExame70461;
END;

CREATE DATABASE DBExame70461;
GO

USE DBExame70461;
GO

CREATE TABLE dbo.Produto
(    Id INT PRIMARY KEY,
    Numero INT,
    Nome VARCHAR(50) NOT NULL,
    Descricao VARCHAR(500) NULL
);
INSERT dbo.Produto (Id, Nome) VALUES (1, 'Melancia');

Explicitamente defini a coluna NOME como obrigatória e a coluna DESCRICAO como opcional. E a coluna NUMERO, é obrigatória? Por padrão quando não explicitamos NULL ou NOT NULL a coluna será nulável. E a coluna ID? Neste caso, a coluna foi definida como chave-primária e, por consequência, ela será implicitamente criada como NOT NULL. Por fim, na instrução INSERT eu especifiquei apenas as colunas não nuláveis (obrigatórias).

Nulo não é valor, pelo contrário, nulo indica ausência de valor.

Constraints

Como já foi mencionado, constraint é um mecanismo que permite restringir o conjunto de valores para uma dada coluna ou, no nível da tabela, como os valores de diferentes colunas estão relacionados (relacionamento entre colunas da mesma tabela ou entre colunas de tabelas diferentes). Os tipos de constraints são:

Default Values (Valor Padrão) Integridade de domínio (coluna)
Check (Checagem / Verificação) Integridade de domínio (coluna)
Primary Key (chave-primária) Integridade de entidade (linha)
UNIQUE KEY (chave-única) Integridade de entidade (linha)
Foreign Key (chave-estrangeira) Integridade referencial (entre colunas ou tabelas)

DEFAULT Constraints

Este tipo de constraint fornece um valor padrão para uma coluna. Ter um valor padrão é um recurso útil nas instruções de INSERT. Vejamos abaixo.

USE DBExame70461;

DROP TABLE dbo.Produto;

CREATE TABLE dbo.Produto
(    Id INT PRIMARY KEY DEFAULT 1,
    Numero INT DEFAULT 77,
    Nome VARCHAR(50) NOT NULL DEFAULT 'Produto geral',
    Descricao VARCHAR(500) NULL DEFAULT 'Descrição geral'
);
GO

INSERT dbo.Produto (Id, Numero, Nome, Descricao)
VALUES (DEFAULT, DEFAULT, DEFAULT, DEFAULT);

INSERT dbo.Produto (Id, Numero, Nome, Descricao)
VALUES (2, 88, 'Batata', DEFAULT);

INSERT dbo.Produto (Id)
VALUES (3);

Note que destruí e recriei a tabela. Para criar a constraint bastou adicionar a palavra reservada DEFAULT na instrução CREATE TABLE. No comando INSERT usei a palavra DEFAULT para que seja gravado o valor padrão na respectiva coluna. Na terceira instrução INSERT eu especifiquei apenas a coluna ID, omitindo as demais. Isso é válido quando as colunas omitidas são nuláveis ou possuem constraint default.

CHECK Constraints

Este tipo de constraint limita os valores que são permitidos em uma coluna. Vamos explorar algumas possibilidades.

CREATE TABLE dbo.Vendedores
(    Id INT NOT NULL PRIMARY KEY,
    Nome varchar(50) NOT NULL,
    Sexo char(1) NULL CHECK (Sexo in('M','F')) DEFAULT 'M',
    Comissao int NOT NULL
        constraint Ck_Vendedores_Comissao
        CHECK (Comissao BETWEEN 1 AND 5),
    TipoDeSalario varchar(10) NOT NULL
        CHECK (TipoDeSalario in ('Hora','Semana','Mes')),
    Telefone varchar(9) NULL CHECK (LEN(Telefone) >= 8)
);

Para criar a constraint bastou utilizar a palavra reservada CHECK na instrução CREATE TABLE. Na coluna COMISSAO, de forma explícita, informei o nome para a constraint: CK_Vendedores_Comissao. O benefício de criar uma constraint check com nome customizado é a facilidade em futuras alterações usando o comando ALTER TABLE. Note que para a coluna TELEFONE foi definida uma constraint que obriga o usuário a informar um número de telefone com pelo menos oito dígitos. Perceba, ainda, que para a coluna SEXO criei duas constraints: uma CHECK e outra DEFAULT. A figura abaixo mostra como ficou a tabela após a sua criação.

image

Vejamos o que acontece quando se tenta inserir, por exemplo, um registro de vendedor com uma comissão maior que 5% e com um número de telefone de 3 dígitos.

-- Tentando inserir registro com comissão acima de 5%
INSERT dbo.Vendedores (Id, Nome, Sexo, Comissao, TipoDeSalario, Telefone)
VALUES (1, 'Antonio Silva', 'M', 7, 'Mes', 123456789);

image

-- Tentando inserir registro com telefone de 3 dígitos
INSERT dbo.Vendedores (Id, Nome, Sexo, Comissao, TipoDeSalario, Telefone)
VALUES (1, 'Antonio Silva', 'M', 5, 'Mes', 123);

image

Agora, vamos falar de algo perigoso. Veja que definimos a coluna SEXO como nulável. Contudo, a constraint CHECK nessa coluna obriga informar apenas os valores M e F. Mas, o que acontecerá se tentarmos inserir um NULL nesta coluna? Devido ao fato da coluna aceitar NULL então a constraint não considera um NULL como falso, ou, em outras palavras, o NULL é simplesmente ignorado.

-- Inserindo com sucesso um NULL na coluna SEXO 
INSERT dbo.Vendedores (Id, Nome, Sexo, Comissao, TipoDeSalario, Telefone)
VALUES (1, 'Antonio Silva', NULL, 1, 'Mes', 123456789);

Imaginemos um cenário em que tenhamos de importar um arquivo texto contendo um cadastro de vendedores. Ao abrir o arquivo texto notamos que foi informado valores de comissão fora da faixa de 1 a 5 (existem comissões zeradas e comissões maiores que 5). Para fazer a importação será necessário desabilitar a constraint na coluna COMISSAO e, após a importação, reabilitá-la.

-- Desabilitando a constraint check da coluna COMISSAO
ALTER TABLE dbo.Vendedores
    NOCHECK CONSTRAINT CK_Vendedores_Comissao;

-- Inserindo valores fora da faixa de 1 a 5
INSERT dbo.Vendedores (Id, Nome, Sexo, Comissao, TipoDeSalario, Telefone)
VALUES 
(2, 'Jose', 'M', 7, 'Mes', 123456789),
(3, 'Pedro', 'M', 0, 'Mes', 123456789);

-- Habilitando a constraint check da coluna COMISSAO
ALTER TABLE dbo.Vendedores
    CHECK CONSTRAINT CK_Vendedores_Comissao;

Para eliminar uma constraint, independentemente do seu tipo (seja CHECK, DEFAULT, PRIMARY KEY, etc), faça conforme abaixo.

ALTER TABLE dbo.Vendedores
    DROP CONSTRAINT CK_Vendedores_Comissao;

Imaginemos agora o seguinte cenário (absurdo diga-se de passagem): alterar a tabela e adicionar uma constraint que não permita cadastrar, para novas inserções, nomes de vendedores contendo a palavra SILVA. Atente para o fato de que a nossa tabela de VENDEDORES já contém uma pessoa com o sobrenome SILVA. Veja:

image

Vamos tentar criar essa constraint e ver o que acontece.

-- Tentando criar uma constraint na coluna NOME
ALTER TABLE dbo.Vendedores
    ADD CONSTRAINT CK_Vendedores_Nome CHECK (Nome NOT LIKE '%Silva%');

O SQL Server retorna o seguinte erro:

Msg 547, Level 16, State 0, Line 1

The ALTER TABLE statement conflicted with the CHECK constraint “CK_Vendedores_Nome”. The conflict occurred in database “DBExame70461”, table “dbo.Vendedores”, column ‘Nome’.

Isso acontece porque no momento da criação da constraint o SQL Server verifica, por padrão, se existe algum valor na coluna que não atenda à regra especificada. Como o nosso cenário diz que essa regra deva ser aplicada apenas para “novas inserções”, vejamos como contornar tal situação.

ALTER TABLE dbo.Vendedores WITH NOCHECK
    ADD CONSTRAINT CK_Vendedores_Nome CHECK (Nome NOT LIKE '%Silva%');

Usamos a opção WITH NOCHECK, a qual instrui o SQL Server a criar a constraint sem fazer qualquer verificação. Desta forma, a constraint terá efeito somente para novas inserções. Exemplo:

INSERT dbo.Vendedores (Id, Nome, Sexo, Comissao, TipoDeSalario, Telefone)
VALUES (4, 'Bruno Silva', 'M', 2, 'Mes', 123456789);

image

Table-Level CHECK Constraints

Além de checar valores para uma coluna em particular, uma constraint CHECK pode também ser aplicada no nível da tabela para checar valores relacionados em mais de uma coluna (desde que sejam da mesma tabela). Segue exemplo.

CREATE TABLE dbo.Ferias
(    Id INT NOT NULL PRIMARY KEY,
    Funcionario VARCHAR(50) NOT NULL,
    DataDeInicio DATETIME2 NOT NULL,
    DataDeFim DATETIME2 NOT NULL,
    CONSTRAINT CK_Ferias_Periodo CHECK (DataDeInicio < DataDeFim)
);

-- Tentando inserir uma Data de Início inválida
INSERT dbo.Ferias (Id, Funcionario, DataDeInicio, DataDeFim)
VALUES (1, 'Mariana Souza', '2012-10-31', '2012-10-30');

image

Veja que a constraint check força a integridade, garantindo que a data de início não seja igual ou maior que a data de fim.

Conclusão

No próximo post vamos finalizar o assunto de constraints, abordando os tipos primary key, unique key e foreign key. Até lá!


High Performance Storage Systems for SQL Server

http://www.simple-talk.com/sql/performance/high-performance-storage-systems-for-sql-server/


[SQL Server] Exame 70-461–Material para Complementar os Estudos

Devido ao fato do exame 70-461 ser novo (oficialmente disponível desde o mês de julho deste ano), praticamente não existem materiais de referência em português. Todavia, temos à disposição boas fontes de estudo que estão em inglês.

A primeira referência que deixo para vocês são os dois livros citados abaixo:

Livro: Microsoft SQL Server 2012 T-SQL Fundamentals
Autor: Itzik Ben-Gan
Link:
http://www.amazon.com/Microsoft-Server-2012-T-SQL-Fundamentals/dp/0735658145
Meus comentários: este livro cobre todos os tópicos exigidos no exame 70-461 e vai um pouco além. Ele te ajudará a dominar os fundamentos da programação T-SQL, proporcionando uma excelente base de conhecimentos para os exames seguintes também. Recomendo fortemente.

Livro: Training Kit Exam 70-461: Querying Microsoft SQL Server 2012
Autor: Itzik Ben-Gan
Link:
http://www.amazon.com/Training-Kit-Exam-70-461-Microsoft/dp/0735666059
Meus comentários: sem dúvida alguma a série Training Kit é a que melhor direciona os estudos, pois aborda com exatidão os assuntos exigidos no exame. Além de exercícios que reforçam a aprendizagem, o livro vem com um CD contendo testes que simulam o exame. Vale à pena.

 

Para aqueles que gostam de estudar através da internet, estou deixando uma listagem dos assuntos do exame + respectivos links para os estudos.

1) Create Database Objects (24%)

Create and alter tables using T-SQL syntax (simple statements)

CREATE TABLE

Microsoft Links:
http://msdn.microsoft.com/en-us/library/ms174979(v=sql.110).aspx

DROP TABLE

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms173790(v=sql.110).aspx

ALTER TABLE

Microsoft Links:

http://msdn.microsoft.com/en-us/library/ms190273(v=sql.110).aspx

ALTER COLUMN

Microsoft links:

Veja Alter table

Create and alter views (simple statements)

CREATE VIEW

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms187956(v=sql.110).aspx

ALTER VIEW

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms173846(v=sql.110).aspx

DROP VIEW

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms173492(v=sql.110).aspx

Create indexed views

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms191432(v=sql.110).aspx

Create and modify constraints (simple statements)

create constraints on tables

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms188066(v=sql.110).aspx

define constraints

Microsoft links:

Veja acima

unique constraints

Microsoft links:

Veja acima

default constraints

Microsoft links:

Veja acima

primary and foreign key constraints

Microsoft links:

Veja acima

Create and alter DML triggers

inserted and deleted tables

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms189799(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms176072(v=sql.110).aspx

nested triggers

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms190739(v=sql.110).aspx

types of triggers

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms178110(v=sql.110).aspx

handle multiple rows in a session

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms190752(v=sql.110).aspx

 

2) Work with Data (27%)

Query data by using SELECT statements

use the ranking function to select top(X) rows for multiple categories in a single query

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms189798(v=sql.110).aspx

write and perform queries efficiently using the new code items such as synonyms and joins (except, intersect)

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms188055(v=sql.105).aspx

Implement sub-queries

pivot and unpivot

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms177410(v=SQL.105).aspx

apply operator

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms175156(v=SQL.105).aspx

cte statement

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms190766(v=SQL.105).aspx

with statement

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms175972(v=sql.110).aspx

Implement data types

impact of GUID (newid, newsequentialid) on database performance

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms190348.aspx

http://msdn.microsoft.com/en-us/library/ms189786(v=sql.110).aspx

Implement aggregate queries

new analytic functions

Microsoft links:

http://msdn.microsoft.com/en-us/library/hh213234

spatial aggregates

Microsoft links:

http://msdn.microsoft.com/en-us/library/hh403400(v=sql.110).aspx

Query and manage XML data

understand XML datatypes and their schemas and interoperability with limitations and restrictions

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms189887(v=SQL.90).aspx

implement XML schemas and handling of XML data

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms176009(v=sql.110).aspx

how to handle XML data in SQL Server and when and when not to use it, including XML namespaces

Microsoft links:

http://msdn.microsoft.com/en-us/library/bb522446(v=sql.110).aspx

import and export XML

Microsoft links:

http://msdn.microsoft.com/en-us/library/aa179112(v=SQL.80).aspx

http://msdn.microsoft.com/en-us/library/aa179108(v=sql.110).aspx

XML indexing

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms191497(v=sql.110).aspx

 

3) Modify Data (24%)

Create and alter stored procedures (simple statements)

write a stored procedure to meet a given set of requirements

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms190782(v=sql.110).aspx

branching logic

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms182717(v=sql.110).aspx

create stored procedures and other programmatic objects

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms182717(v=sql.110).aspx

create stored procedures and other programmatic objects

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms187926(v=sql.110).aspx

Modify data by using INSERT, UPDATE, and DELETE statements

given a set of code with defaults, constraints, and triggers, determine the output of a set of DDL

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms174335(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms177523(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms189835(v=sql.110).aspx

use output statement

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms177564(v=sql.110).aspx

Combine datasets

difference between UNION and UNION all

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms180026(v=sql.110).aspx

modify data by using MERGE statements

Microsoft links:

http://msdn.microsoft.com/en-us/library/bb510625(v=sql.110).aspx

Work with functions

understand deterministic and non-deterministic functions

Microsoft links:

http://msdn.microsoft.com/en-us/library/aa214775(v=SQL.110).aspx

create and alter user-defined functions (UDFs)

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms186755(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms186967(v=sql.110).aspx

4) Troubleshoot and Optimize Queries (25%)

Optimize queries

understand statistics

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms190397(v=sql.110).aspx

DMVs

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms188754(v=sql.110).aspx

hints

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms181714(v=sql.110).aspx

statistics IO

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms184361(v=sql.110).aspx

Manage transactions

understand begin tran, commit, and rollback

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms174377(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms188929(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms190295(v=sql.110).aspx

http://msdn.microsoft.com/en-us/library/ms181299(v=sql.110).aspx

implicit vs. explicit transactions

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms187807(v=sql.110).aspx

isolation levels

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms173763.aspx

trancount

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms187967(v=sql.110).aspx

Implement error handling

implement try/catch/throw

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms175976(v=sql.110).aspx

transaction management

Microsoft links:

http://msdn.microsoft.com/en-us/library/ms174377(v=sql.110).aspx


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


SQLCotonete – Episódio 02: Alta Disponibilidade

No segundo episódio do SQLCotonete, Adeilson, Laerte, Marcus e Nilton Pinheiro conversam sobre soluções de alta disponibilidade no SQL Server. Ouça este episódio e nos dê seu feedback.

Link para baixar o arquivo MP3 (48 MB)

 


Conceitos básicos de modelagem de dados

http://www.macoratti.net/cbmd1.htm


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

Este tópico possui um enunciado um tanto confuso: ensure code non regression by keeping consistent signature for procedure, views and function (interfaces); security implications. Inicialmente precisamos perceber que o tópico vai além de views, abordando também procedures e functions. Por conseguinte, vale destacar que o conteúdo a ser estudado para o exame 70-461 possui escopo mais amplo que DML, envolvendo temas como objetos programáveis (views, sp, functions, triggers) e assuntos avançados como transações, manipulação de XML, dentre outros. Assim, não se iluda: estude e se prepare para uma prova desafiadora que lhe exigirá além do conhecimento de consultas T-SQL e modificação de dados.

Quanto ao conteúdo do tópico 3 vamos quebrá-lo em duas partes, visando dirimir quaisquer confusões:
1) Não regressão de código mantendo consistentes assinaturas nas interfaces dos objetos (view, sp, function)
2) Implicações de segurança

Não regressão de código mantendo consistentes assinaturas nas interfaces dos objetos (view, sp, function)

Pode até parecer confuso, mas a idéia por trás dessas palavras é bem simples: quebrar a dependência. Imaginemos uma view que retorna 3 colunas: CODIGO, NOME, DT_NASCIMENTO, sendo todas recuperadas a partir de uma tabela de candidatos a ofertas de emprego. Agora imagine que o DBA renomeou na tabela (e também na view) a coluna DT_NASCIMENTO para DATA_NASCIMENTO. Enquanto não forem recompiladas, as aplicações que utilizam a view passarão a apresentar erro, vez que ainda referenciam a coluna como DT_NASCIMENTO. Este é um problema típico de dependência: os nomes expostos pela view para as colunas são exatamente os mesmos utilizados nas tabelas. Sendo assim, tudo o que precisamos fazer é tratar a assinatura do objeto, expondo nomes que serão mantidos independente de quaisquer modificações nas tabelas referenciadas, de modo a garantir a não necessidade de manutenção nas aplicações ou em outros objetos programáveis do BD que consomem a view. Vejamos o exemplo da tabela CANDIDATO.

USE DBExame70461
GO
— Cria a tabela de candidatos
CREATE TABLE dbo.Candidato
( CODIGO INT,
NOME VARCHAR(50),
DT_NASCIMENTO DATETIME);
GO

INSERT dbo.Candidato VALUES(1, ‘Mariana Pereira da Silva’, ‘19801224’);
GO

— Cria a view
CREATE VIEW dbo.vwCandidatos
AS
SELECT Codigo, Nome, Dt_Nascimento
FROM dbo.Candidato;
go

— Cria uma sp para consumir a view
CREATE PROCEDURE dbo.uspObterCandidatos
AS
SELECT Codigo, Nome, Dt_Nascimento FROM dbo.vwCandidatos;
GO

Neste exemplo criamos uma procedure que consome a view. Note que esta procedure produz um result set, ou seja, apresenta o resultado de uma query. A SP (stored procedure) tem uma dependência direta com a view, enquanto que esta usa os mesmos nomes de colunas da tabela referenciada. Para executarmos a SP basta fazer como abaixo:

EXEC dbo.uspObterCandidatos;

Agora vamos renomear a coluna DT_NASCIMENTO para DATA_NASCIMENTO, na tabela.

— Renomeando a coluna na tabela
EXEC sp_rename ‘dbo.Candidato.DT_NASCIMENTO’, ‘DATA_NASCIMENTO’;

Observe a mensagem que aparece após a execução desta sp builtin: “Caution: Changing any part of an object name could break scripts and stored procedures”. Neste momento a view não está mais funcionando, sendo necessário alterar a view.

— Renomeando na view
ALTER VIEW dbo.vwCandidatos
AS
SELECT Codigo, Nome, Data_Nascimento
FROM dbo.Candidato;
go

Como consequência a SP também parou de funcionar, sendo necessário recompilá-la de modo a refletir o novo nome da coluna. Tente executar o código abaixo e veja o resultado:

exec dbo.uspObterCandidatos
Invalid column name ‘Dt_Nascimento’

Para evitar essa “regressão de código”, vamos modificar a assinatura da view e quebrar a dependência (pelo menos no nível da interface). Isso pode ser feito de duas maneiras.

— Criando ALIAS para as colunas diretamente na lista do SELECT
ALTER VIEW dbo.vwCandidatos
AS
SELECT
Codigo As Codigo,
Nome as Nome,
Data_Nascimento As Dt_Nascimento
FROM dbo.Candidato;
go

— Declarando externamente os ALIAS para as colunas
ALTER VIEW dbo.vwCandidatos (Codigo, Nome, Dt_Nascimento)
AS
SELECT
Codigo,
Nome,
Data_Nascimento
FROM dbo.Candidato;
go

Execute novamente a sp abaixo e veja que o problema foi resolvido.
exec dbo.uspObterCandidatos

A adoção deste tipo de abordagem diminui intervenções em aplicações e ou objetos que consomem uma view. A mesma estratégia pode ser aplicada em SP’s que retornem  result set ou em TVF’s – Table Valued Functions (funções que retornam tabelas).Ainda vale destacar o uso da opção SCHEMABINDING. Ao usarmos tal opção o DBA simplesmente não conseguiria alterar a estrutura da tabela, vez que a opção SCHEMABINDING “prende” a tabela à view ou a function (não existe opção SCHEMABINDING em SP), produzindo uma dependência que não pode ser quebrada. Neste caso, o DBA precisaria alterar a view/function e remover a opção SCHEMABINDING para, em seguida, alterar a tabela.

Conclusão
No próximo post falaremos a respeito das considerações de segurança no projeto de views. Até lá.


Púlpito Cristão » Pastor é o Ungido do Senhor?

http://www.pulpitocristao.com/2009/08/pastor-e-o-ungido-do-senhor-2/