Arquivo da tag: Manipulação

Dica do Mês – Você sabe o que é Normalização de Banco de Dados?


Olá galera, bom dia, bom dia comunidade!!!

Estou de volta com mais um post da sessão Dica do Mês, nossa como o tempo esta passando, este é o sexto post desta nova sessão criada este ano no meu blog e que lentamente começa a apresentar alguns resultados. Como você já deve estar acostumado quando visita o meu blog, todo final de mês é dedicado a post exclusivos das sessões Dica do Mês e Para que Serve.

No último post publicado no mês de Maio, apresentei um conteúdo mais focado para área acadêmica e hoje não será diferente, vou falar sobre um dos conceitos mais importantes quando falamos sobre banco de dados, estou me referindo a Normalização de Dados ou para muitos Normalização.

 Acredito que você já deve ter ouvir falar sobre este conceito, para muitos algo bastante complexo, mas na verdade não é bem assim, por isso eu decidi compartilhar com vocês um pouco do meu conhecimento nesta área.

Então, seja bem vindo a mais uma dica do mês, começa aqui a Dica do Mês – Você sabe o que é Normalização de Banco de Dados?


Introdução

Conhecida como técnicas de racionalização das estruturas de dados de um sistema, eliminando redundâncias, problemas de manipulação e armazenamento, basicamente a normalização é um processo através do qual esquemas de relação, que não sejam satisfatórios às características do modelo relacional, são decompostos em esquemas menores que satisfaçam as propriedades desejáveis.

Inicialmente proposta como uma ferramenta de auxílio no projeto físico para a definição de relações, porém na prática tornou-se uma ferramenta de verificação, pois serve para verificar se os esquemas do projeto físico satisfazem algumas características básicas. Estas características são conhecidas como medidas de qualidade que devem obrigatóriamente estar alinhadas as necessidades do projeto de banco de dados e seu modelagem conceitual.

Medidas de Qualidade

Na normalização, são analisadas algumas medidas de qualidade para o projeto de um esquema de relação. Estas medidas de qualidade visam, por exemplo, evitar um mau uso da memória. As medidas são as seguintes:

1 – Correta representação semântica – os dados devem ser projetados de forma a terem seus significados bem definidos e coerentes com o que realmente querem representar;

2 – Redução de valores redundantes – sempre que possível deve-se reduzir ao máximo os valores redundantes desnecessários, ou seja, valores que muitas vezes aparecem repetidos quando isto não seria preciso;

3 – Redução de valores nulos – sempre que possível deve-se reduzir o número de atributos que por alguma razão receberão muitos valores nulos;

4 – Não geração de tuplas espúrias (sem sentido) – durante o processo de normalização deve-se atentar para evitar que sejam geradas tuplas que não façam sentido diante da realidade, isto pode ocorrer devido a alguma decomposição.

Estas medidas de qualidade nos ajudam a estabelecer uma estrutura organizacional para nosso modelo de banco de dados, onde podemos tentar afirmar que estamos criando um cenário para armazenar com coerência.

Outro elemento muito importante quando estamos trabalhando com Normalização é a chamada dependência funcional, conhecida como propriedade da semântica ou do significado dos atributos. Você pode estar se perguntando poxa vida o que seria isso, calma vou tentar se ajudar neste respostas.

Dependência Funcional

As decomposições da normalização ocorrem seguindo os conceitos de dependências funcionais. A seguir estes conceitos serão apresentados, juntamente com as três principais e mais utilizadas formas normais.

Uma dependência funcional (DF) é uma propriedade da semântica ou do significado dos atributos. Formalmente, uma dependência funcional entre dois conjuntos de atributos, x e y, que são subconjuntos de um esquema de relação R, denotada por x® y é uma restrição que estabelece que para quaisquer tuplas t1 e t2 de uma instância r de R, tal que, se temos t1[x] = t2[x], então também devemos ter que t1[y] = t2[y].

Em outras palavras, os valores do componente y em uma tupla de r dependem de (ou são determinados por) valores do componente x.

Por exemplo:  Seja x = {Matrícula} e y = {Nome, Endereço, Telefone, CodCurso}, então {Matrícula} {Nome, Endereço, Telefone, CodCurso}, ou seja, a depender do valor da Matrícula, serão determinados os valores do Nome, Endereço, Telefone, e CodCurso.

Quando se define uma dependência funcional, esta regra deve valer para todas as instâncias da relação, é como se fosse uma restrição de integridade, onde em muitos casos não se pode deduzir a existência de uma dependência, conforme a Figura 1 apresentada abaixo demonstra:

Normalização

Figura 1 – Exemplo de como podemos identificar a existência ou não de dependência funcional.

Seguindo em frente, agora que conhecemos um pouco sobre a normalização, suas medidas de qualidade e seu principal elemento de decomposição chamado dependência funcional, o próximo passo é justamente conhecer e entender um pouco mais sobre esta técnica de decomposição de estrutura, para tal será necessário se aprofundar um pouco mais, vamos então começar a desmistificar as tão temidas Formas Normais (kkkkkk), tenho a certeza que você vai gostar.

Formas Normais Baseadas em Chaves Primárias

O processo de normalização é realizado gradativamente através de formas normais, definidas a partir do conceito de DF. As três principais formas normais são a Primeira Forma Normal (1FN), a Segunda Forma Normal (2FN) e a Terceira Forma Normal (3FN).

1FN  2FN  3FN……

Este processo de normalização é composto por algumas propriedades:

  1. Junções sem perda – uma vez definida uma decomposição, caso esta seja recomposta através de uma operação de junção, no resultado gerado não pode haver perdas;  e
  2. Preservação de dependências – assegura que cada DF seja representada em algumas relações individuais resultantes após a decomposição.

A Figura 2 apresentada a seguir ilustra como as formas normais trabalham, sua forma de uso e finalidade:

Normalização1
Figura 2 – Resumo formas normais.

Primeira Forma Normal (1FN)

Um esquema de relação R está na 1FN se todos os seus atributos forem atômicos e monovalorados, ou seja, não possuem valores que formam atributos compostos.

1 – Exemplo:
ESTUDANTES = {MATRÍCULA + NOME + ENDEREÇO + CODCURSO} e
ENDEREÇO é um atributo composto, ENDEREÇO = {RUA + NUMERO + BAIRRO + CIDADE + UF}.

Para colocar na 1FN faz:
ESTUDANTES={MATRÍCULA+NOME+RUA+NUMERO+BAIRRO+CIDADE+UF+CODCURSO}

Um esquema de relação R está na 1FN se todos os seus atributos forem atômicos e monovalorados, ou seja, não possuem valores que formam atributos compostos.

2 – Exemplo:

FUNCIONÁRIOS = {CODFUNC + NOME + CARGO + {PROJETO + DATAINI + DATAFIM}}

Para colocar na 1FN faz:

– FUNCIONÁRIOS = {CODFUNC + NOME + CARGO}

– FUNC_PROJ = {CODFUNC + PROJETO + DATAINI + DATAFIM}

Observação: todas as tabelas são relações na 1FN.

 

Segunda Forma Normal (2FN)

Dependência funcional total ou completa: Uma DF x® y é total, se não existir nenhum atributo A em x, tal que (x – {A})® y, para qualquer AÎ x, ou seja, se retirarmos este atributo A da relação x a DF deixa de existir. Caso contrário, x® y é parcial.

Definição da 2FN: Um esquema de relação está na 2FN se: estiver na 1FN e, além disso, todo atributo que não pertença a alguma de suas chaves for totalmente dependente da sua chave primária.

Em outras palavras, para que uma relação esteja na 2FN é preciso que esteja na 1FN e que, havendo uma chave primária composta, todos os dados que não são chaves dependem de toda a chave primária (a chave primária completa).

Seja o exemplo de uma relação que represente o estoque de um estabelecimento comercial, da seguinte forma:

ESTOQUE = {PRODUTO + ALMOX + END_ALMOX + UNID_EST + QTD + PRECO}

Não está na 2FN porque alguns dados não chave dependem somente de parte da chave, como END_ALMOX depende só de ALMOX, e UNID_EST depende só de PRODUTO.

Com a normalizando ficaria:
– Estoque = {PRODUTO + UNID_EST}
– Almoxarifado = {ALMOX + END_ALMOX}
– Produto= {PRODUTO + ALMOX + QTD + PRECO}

 

Terceira Forma Normal (3FN)

Dependência funcional transitiva: Uma DF x® y é transitiva em um esquema de relação R se existir um conjunto de atributos z, que não seja um subconjunto de alguma chave de R, e as DFs x® z e z® y forem válidas em R.

Um esquema de relação está na 3FN se: estiver na 2FN e, além disso, nenhum atributo que não pertença a alguma das suas chaves for transitivamente dependente da sua chave primária.

Em outras palavras, para que uma relação esteja na 3FN é preciso que esteja na 2FN e todo atributo, que não pertença a alguma chave for não dependente de algum outro atributo, que também não pertença a alguma chave.

Seja o exemplo de uma relação que represente os dados referentes às músicas, da seguinte forma:

Exemplo: MÚSICA = {CÓDIGO + TÍTULO + GÊNERO + PAÍS_ORIGEM}, supondo que neste exemplo, o PAÍS_ORIGEM refere-se ao GÊNERO musical e não a música, sendo assim, apesar de estar na 2FN, a relação não está na 3FN, pois existe  dependência entre GÊNERO e PAÍS_ORIGEM.

Com a normalizando ficaria:
MÚS_1 = {CÓDIGO + TÍTULO + GÊNERO}
MÚS_2 = {GÊNERO + PAÍS_ORIGEM}

Acredito que você pode ter entendido como inicialmente a normalização de dados vai influenciar na estrutura da sua modelagem de dados, como a mesma vai ser elaborada, estruturada e elaborada.

Para tentar ajudar o seu entendimento e tentar praticar o que estamos vendo neste post, vou deixar algumas perguntas que podem ser de extrema importância para o esclarecimento de dúvidas, como também, um exercício prático de normalização.


Questionário

1.O que é uma dependência funcional?

2.Quem especifica as dependências funcionais que se mantêm (são válidas) entre os atributos de um esquema de relação?

3.A que se refere a expressão “relação desnormalizada”?

4.Defina primeira, segunda e terceira formas normais quando somente chaves primárias são consideradas. Como as definições da 2FN e 3FN, que consideram todas as chaves de uma relação, diferem daquelas que consideram somente chaves primárias?

Exercício

Sejam os seguintes dados de uma locadora de automóveis:

A locadora aluga automóveis de uma determinada marca apenas para clientes pessoa jurídica (empresas). Estes clientes credenciam motoristas para utilizarem os veículos, o preço diário de aluguel e a potência do carro dependem de seu modelo. Considerando que a locadora necessite, para seu controle, dos dados descritos na seguinte relação:

  • REGISTRO_ALUGUEL = {NumCNH + NomeMotorista + DataNasc + CGCCliente + NomeCliente + EndCliente + {PlacaCarro + Modelo + Cor + Potência + QTDDiárias + PreçoDiária}}

Sendo assim chegamos ao final de mais uma dica do mês.

O conhecimento técnico é muito importante para qualquer profissional, mas o conceito é algo que sempre devemos valorizar e conhecer, a diferença entre um bom profissional e um profissional reconhecido e respeitado no mercado de trabalho é saber aliar o conhecimento teórico com o conhecimento prática, como muitos costumam dizer aliar a téoria a prática, sendo este o objetivo deste post.

Espero que você tenha gostado, que as informações e exemplos publicadas possam de alguma maneira ajudar e colaborar com suas atividades diárias, profissionais e ou acadêmicas.

Desejo um forte abraço, agradeço mais uma vez a sua visita.

Até mais.

 

Anúncios

Conhecendo a Stored Procedure não documentada MSunmarkreplinfo


Galera, bom dia.

Tudo bem?

A dica de hoje tem o objetivo de apresentar uma das diversas Stored Procedures existentes no SQL Server, mas que não possuem documentação oficial por parte da Microsoft, estou se referindo a MSunmarkreplinfo, que recentemente acabei conhecendo e utilizando.

Para apresentar mais sobre esta Stored Procedure, vou contar um pouco do que aconteceu e como consegui encontrar esta relíquia.

Nos últimos dias um dos meus clientes solicitou a configuração de uma estrutura de Replicação Transacional para suas bases de dados, até ai sem problemas, todo processo de configuração do Publisher e Subscriber realizado normalmente, especificando os artigos que seriam replicados entre os servidores, horário de replicação, filtros, entre outros detalhes.

Pois bem, durante alguns dias o processo de replicação funcionou sem problemas, mas no último final de semana, um dos programadores da empresa tinha a necessidade de aplicar algumas atualizações ao ambiente, dentre os elementos que seriam atualizados uma das bases de dados que estava envolvida na replicação seria envolvida nesta atualização.

Dentre os procedimentos padrões definidos pelo desenvolvedor para aplicar as atualizações consistia em realização do backup e posteriormente fazer um detach do banco de dados, foi justamente neste ponto que os problemas começaram a aparecer!!!

Não sei exatamente por qual motivo mas somente realizando o detach do banco de dados as atualizações na aplicação e banco eram aplicadas corretamente e o ambiente voltava a funcionar. Em conversa com o programar informei que poderíamos manter a estrutura de replicação e no processo de detach realizar alguns procedimentos específicos para os bancos envolvidos no processo de replica. Mas como santo de casa não faz milagre, o cara ficou louco, e disse que desta forma não poderia mais trabalhar, então acabou sobrando pra mim, você já podem imaginar o que aconteceu. Tive que remover todo processo de replicação para este banco de dados, ai que vem o pior, durante o processo de remoção da estrutura de replicação o servidor sem qualquer motivo específico travou.

Com certeza vocês podem imaginar alguns dos principais problemas durante um processo de reconfiguração de um ambiente o servidor travar, mas para minha felicidade ou infelicidade o banco de dados, não sofreu maiores problemas, mas o SQL Server não conseguiu remover o status das tabelas envolvidas na replicação, como sendo artigos replicados, desta forma, todo e qualquer processo de alteração na estrutura ou até mesmo exclusão das tabelas não poderiam ser realizados.

Nesta momento, eu consegui entender que o SQL Server ainda estava trabalhando com a replicação mesmo que toda estrutura tivesse sido removida, o que naquele momento poderia dizer que exista então um processo de replicação fantasma, conhecida como Ghost Replication, algo muito comum de se acontecer quando realizamos alterações nas configurações de uma replicação transacional e ocorrem falhas no ambiente.

Mesmo assim, sabendo da possível existência da Ghost Replication, o programador, tentou excluir a tabela ou até mesmo realizar algumas alterações em sua estrutura, foi neste momento que ao realizar por exemplo um simples Drop Table ou Alter Table, o SQL Server apresentava a seguinte mensagem:

Unable to drop a table even after removing replication. Getting the following errors, when try to drop or alter the table:
Server: Msg 3724, Level 16, State 2, Line 1
Cannot drop the table ‘t1’ because it is published for replication.
Server: Msg 4931, Level 16, State 1, Line 1
Cannot add columns to table ‘t1’ because it is being published for merge replication.

Básicamente a mensagem informava que era impossível realizar a exclusão ou alterações na tabela pois a mesma estava envolvida em um processo de replicação.

Ao entrar em contato comigo e alertar sobre esta situação, o programador destacou a impossibilidade de manter o ambiente em funcionamento sem poder aplicar as novas atualizações.

Foi justamente com base nesta situação e sabendo que o status das tabelas envolvidas na replicação não haviam sido alterados, comecei a realizar algumas tentativas de alteração direta nas tabelas e visões de catálogo de sistema existentes no SQL Server 2005, trabalhando diretamente com a Sys.Objetcs e Sys.SysObjects.

Dentre as diversas tentativas, tentei alterar as colunas ReplInfo e Is_Published existentes nas respectivas tabelas e visões de catálogo, mas para minha raiva não consegui realizar a alteração. O SQL Server retornava uma mensagem informando que existia dependência entre estes objetos de sistemas o que impossibilitava esta alteração.

Lógicamente neste instante o que me restava era tentar de alguma forma buscar mais informações, através do Books On-Line, como também, utilizando a própria Internet. Em ambos as alternativas praticamente encontrei os mesmos exemplos, procedimentos, dicas e sugestões. Mas como a esperança é a última que morre comecei a buscar mais informações nos Fóruns MSDN e TechNet nos Estados Unidos e foi justamente neste locais que encontrei informações e exemplos de como utilizar MSunmarkreplinfo.

Não encontrei muita coisa sobre esta Stored Procedure, mas o pouco que encontrei foi o suficiente para conseguir resolver o meu problema, e justamente esta solução que vou compartilhar com vocês, conforme o exemplo apresentado a seguir:

 — Exemplo: Utilizando a MSunmarkreplinfo para remover o Status de tabela envolvida em replicação —

SET NOCOUNT ON
DECLARE @tablename NVARCHAR(128), @RC INT

DECLARE curTable CURSOR FOR
SELECT [name] AS tbl FROM sys.tables

OPEN curTable
FETCH NEXT FROM curTable INTO @tablename

 WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE @RC = dbo.sp_MSunmarkreplinfo @tablename
FETCH NEXT FROM curTable INTO @tablename
END

 CLOSE curTable
DEALLOCATE curTable
GO

Com o código apresentado anteriormente consegui alterar de uma forma forçada as colunas ReplInfo e Is_Published na tabela de catálogo de sistema Sys.Objects e utilizada também pela Sys.SysObjects, desta forma, o programador já poderia realizar todas as alterações desejadas, mecher na estrutura das tabelas, como também, executar qualquer outro tipo de procedimento em seu ambiente.

Sendo assim, tudo voltou ao normal, mas o processo de replicação não pode mais ser configurado a este ambiente, fazendo-se necessário adotar outros processos de disponibilidade dos dados entre os servidores da empresa.

Espero que esta dica possa ter ilustrado um pouco de como é possível utilizar Stored Procedures não documentadas em algumas situações, vale ressaltar que qualquer procedimento desconhecido deve ser analisado e realizado em ambientes de teste.

Agradeço a sua visita, nos encontramos em breve.

Até mais.

Resposta – Script Challenge – Número 9


Salve pessoal…

Estou de volta, agora com a resposta para o Script Challenger – Número 9, postado a algumas a semanas. Bom, para aqueles que não se lembram do código postado, segue abaixo novamente o script utilizado neste desafio.

– Script Challenge – Número 9 –

Create Trigger T_Calcular_Horas
On CTProducao_Moinho
For Insert, Update
As
Declare @TotalDias VarChar(4),
@TotalHoras VarChar(3),
@TotalMinutos VarChar(4),
@NUMMO CHAR(7),
@ValorFormatado Char(5)

Set @NUMMO=(Select NUMMO from Inserted)

Set @TotalDias=(Select DateDiff(Day,DataInicio,DataFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)
Set @TotalHoras=(Select DateDiff(Hour,Convert(Char(20),DataInicio,103)+HoraInicio,Convert(Char(20),DataFinal,103)+HoraFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)
Set @TotalMinutos=(Select DateDiff(Minute,Convert(Char(20),DataInicio,103)+HoraInicio,Convert(Char(20),DataFinal,103)+HoraFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)

If @TotalDias >=2
Begin
Update CTProducao_Moinho
Set TotalHoras=@TotalHoras+’:00′
Where NUMMO=@NUMMO
End
Else
Begin
If (@TotalHoras >=1) And (@TotalHoras <=24)
Begin
If (@TotalHoras = 1) And (@TotalMinutos < 60)
Set @ValorFormatado=’00:’+@TotalMinutos

If (Len(@TotalHoras) = 1) And (@TotalMinutos > 60)
Begin
Set @ValorFormatado=Convert(Char(4),Convert(Int,@TotalMinutos)/Convert(Int,@TotalHoras))
Set @ValorFormatado=’0′+@TotalHoras+’:’+@ValorFormatado
End

If (Len(@TotalHoras) = 1)
Set @ValorFormatado=’0′+@TotalHoras+’:00′

If (Len(@TotalHoras) = 1) And (@TotalMinutos = 60)
Set @ValorFormatado=’0′+@TotalHoras+’:00′

Update CTProducao_Moinho
Set TotalHoras=@ValorFormatado
Where NUMMO=@NUMMO
End
Else
Begin
If @TotalMinutos=60
Begin
Update CTProducao_Moinho
Set TotalHoras=’01:00′
Where NUMMO=@NUMMO
End
Else
Begin
If Len(@TotalMinutos) = 1
Set @ValorFormatado=’00:0′+@TotalMinutos
Else
Set @ValorFormatado=’00:’+@TotalMinutos

Update CTProducao_Moinho
Set TotalHoras = @ValorFormatado
Where NUMMO=@NUMMO
End
End
End

Pois bem, você conseguiu encontrar a respostas para este Código? Diversos participantes me enviaram por e-mail suas respostas, alias foram diversas, eu fiquei surpreso, pois este desafio apresentou o maior número de respostas obtidas até agora. Foram aproxidamente 100 respostas, com observações, dicas, críticas e comentários sobre o código.

Para aqueles que não participaram, a resposta deste Script Challenger – Número 9 é muito simples.

Como vocês podem observar, trata-se de um Trigger chamado T_Calcular_Horas vínculado a tabel CTProducao_Moinho, disparado na ocorrências de Inserts e Updates.

A função básica deste trigger e análisar através de algumas condições uma possível diferenção entre horas, minutos e segundos para formatar o valor de preenchimento do campo TotalHoras, utilizado em um ERP para controle de qualidade na área de produção de uma indústria que trabalhei a algum tempo.

De acordo com o valores de diferença, realizo a concatenação dos valores e posteriormente, a trigger executa um Update sobre a Table CTProducao_Moinho diretamente no campo TotalHoras.

Vale ressaltar que este script respeita algumas regras de negócios da empresa e também do ERP por isso, foi necessário realizar estas análises, conversões e concatenações de valores.

Muito bem galera, esta aqui a resposta, espero que todos possam ter entendido e gostado.

Nos encontramos nos próximos Script Challenger.

Até mais.

Utilizando Backup de Filegroup no SQL Server – Parte III


Pessoal, bom dia.

Estou de volta com a minha série de artigos sobre Backup de Filegroup no SQL Server, hoje vou postar a terceira parte desta série, espero que todos possam estar gostando e que este material.

Nesta terceira parte, vamos começar a criar nosso ambiente de trabalho, posteriormente utilizado em nossos testes:

Criando o ambiente

Após conhecermos um pouco sobre os principais termos e modelos de recuperação de banco de dados relacionados á Backup de Filegroup, vamos começar a montar nosso ambiente de trabalho.

Conforme destaquei anteriormente, daremos ínicio através da criação do Banco de Dados, chamado SQL, conforme apresenta a Listagem 1. Importante destacar que esta banco de dados esta utilizando o Modelo de Recuperação Completo (Recovery Model Full) e seu log de transações será mantido mesmo após a realização dos backups.

Listagem 1. Criação do Banco de dados

 — Bloco 1 —

CREATE DATABASE SQL

ON PRIMARY

(NAME = SQL_Dados,

FILENAME = N’C:\SQL\SQL_Dados.mdf’,

SIZE = 10MB,

MAXSIZE =50MB,

FILEGROWTH =10%),

FILEGROUP Secondary

(NAME = SQL_Secondary_Dados,

FILENAME = N’C:\SQL\SQL_Secondary_Dados.ndf’,

SIZE = 10MB,

MAXSIZE = 50MB,

FILEGROWTH = 10%)

LOG ON

(NAME = SQL_Log,

FILENAME = N’C:\SQL\SQL_Log.ldf’,

SIZE = 10MB,

MAXSIZE = 50MB,

FILEGROWTH = 10%)

GO

A Figura 5 apresenta em forma gráfica a distribuição dos arquivos e seus respectivos filegroups, para obter estas informações em linha de comando, utilize as systems views: sys.sysfiles ou sys.sysfilegroups no SQL Server 2005 ou 2008.

Figura 5. Estrutura de Filegroups que compõem o Banco de Dados SQL.

 Agora vamos criar as tabelas Produtos e Armazens, posteriormente criaremos seus respectivos índices e iremos distribuí-las no Filegroup Primary, conforme apresenta a Listagem 2. Os índices criados nestas tabelas, possuem o efeito de demonstração ou mera ilustração, não estamos se preocupando com questões de performance ou estatísticas de utilização.

Listagem 2. Criação das Tabelas Produtos e Armazens

— Bloco 1 —

Create Table Produtos

(Codigo SmallInt Not Null,

Descricao VarChar(60) Not Null,

Marca VarChar(20) Not Null,

DataFabricacao DateTime Null,

DataValidade DateTime Null,

CodArmazem SmallInt Not Null ) On [Primary]

Go

— Bloco 2 —

Alter Table Produtos

Add Constraint [PK_Codigo_Produto] Primary Key Clustered (Codigo) On [Primary]

Go

— Bloco 3 —

Create NonClustered Index IND_Descricao_Produtos on Produtos(Descricao) On [Primary]

Go

— Bloco 4 —

Create Table Armazens

(Codigo TinyInt Not Null,

Descricao VarChar(20),

Situacao Char(1)) On [Primary]

Go

— Bloco 5 —

Alter Table Armazens

Add Constraint [PK_Codigo_Armazem] Primary Key Clustered (Codigo) On [Primary]

Go

— Bloco 6 —

Create Unique NonClustered Index UIND_Descricao_Armazem On Armazens(Descricao) ON [Primary]

Go

Neste momento nossas tabelas Produtos e Armazens estão criadas, através da system stored procedure SP_HELP, vamos consultar a estrutura de informações que compõem a tabela Produtos, dentre estas informações, destacamos o filegroup ao qual esta tabela esta armazenada. Sendo este o filegroup Primary, para isso utilizaremos a Listagem 3, e podemos observar o retorno dos dados, conforme apresenta a Figura 6.

Listagem 3. Consultando as informações das tabelas Produtos e Armazens.

— Bloco 1 —

SP_HELP ‘Produtos’

Figura 6. Informações sobre a tabela Produtos armazenada no filegroup Primary.

Após consultarmos as informações estas a tabela Produtos, vamos então realizar a inserção de uma pequena massa de dados em
ambas as tabelas. Esta massa de dados será utilizada posteriormente. Para realizar a inserção dos dados,  utilizaremos a Listagem 4.

Listagem 4. Inserção de dados na tabela Armazens

— Bloco 1 —

USE SQL

Go

— Bloco 2 —

Insert Into Armazens (Codigo, Descricao, Situacao) Values(1,’Matriz A’, ‘A’)

Insert Into Armazens (Codigo, Descricao, Situacao) Values(2,’Matriz B’, ‘A’)

Insert Into Armazens (Codigo, Descricao, Situacao) Values(3,’Filial 1′, ‘A’)

Insert Into Armazens (Codigo, Descricao, Situacao) Values(4,’Filial 2′, ‘A’)

Go

Inserimos as 4 linhas de dados na tabela Armazens, vamos agora inserir 2000 (duas mil) linhas de registros na tabela Produtos,
conforme apresenta a Listagem 5.

Listagem 5. Inserção de dados na tabela Produtos

— Bloco 1 —

Declare @Codigo Int,  @CodArmazem SmallInt

Set @Codigo=1

While @Codigo <=2000

Begin

If @Codigo <=500

Set @CodArmazem=1

Else If (@Codigo >500 And @Codigo <=1000)

Set @CodArmazem=2

Else If (@Codigo >1000 And @Codigo <=1500)

Set @CodArmazem=3

Else Set @CodArmazem=4

Insert Into Produtos(Codigo, Descricao, Marca, DataFabricacao, DataValidade, CodArmazem)

Values(@Codigo,’Produto nº:’+CONVERT(VarChar(4),@Codigo), ‘SQL’,GETDATE(),GETDATE()+@Codigo, @CodArmazem)

Set @Codigo=@Codigo+1

End

Go

Pronto acabamos de inserir 2000(duas mil) linhas de registros na tabela Produtos, nossa primeira parte do ambiente esta pronta. Podemos criar as outras duas tabelas Estocagem e Saldos, que serão armazenadas na filegroup Secondary conforme apresenta a Listagem 6.

Listagem 6. Criando as tabelas Estocagem e Saldos

— Bloco 1 —

Create Table Estocagem

(CodEstocagem Int Identity(1,1),

CodProduto SmallInt Not Null,

CodArmazem TinyInt Not Null,

Quantidade Float Not Null) On [Secondary]

Go

— Bloco 2 —

Alter Table Estocagem Add Constraint [PK_CodEstocagem_Estocagem] Primary Key Clustered (CodEstocagem) On [Secondary]

Go

— Bloco 3 —

Create NonClustered Index IND_CodProduto_Estocagem  On Estocagem(CodProduto) On [Secondary]

Go

— Bloco 4 —

Create Table Saldos

(Codigo Int Identity(1,1) Primary Key,

CodProduto SmallInt Not Null,

SaldoProduto Float) On  [Secondary]

Go

Desta forma, começamos a entender um pouco mais sobre o função e finalidade em se trabalhar com mais de um filegroup, neste momento, nosso ambiente esta dividir fisicamente, onde as tabelas Produtos e Armazens estão armazenadas no filegroup Primary e as tabelas Estocagem e Saldos estão armazenadas no filegroup Secondary.

Caso um dos filegroups apresente alguma falha, as tabelas armazenadas no outro filegroup não sofreram nenhum impacto. Agora todas as tabelas estão criadas e armazenadas em seus respectivos filegroups, iremos executar o mesmo
procedimento realizado anteriormente, através da system stored procedure SP_HELP, consultaremos a estrutura de informações da tabela Saldos, podendo confirmar que esta tabela armazenada e vínculada fisicamente ao filegroup Secondary, conforme apresenta a Figura 7.

Figura 7. Informações sobre a tabela Produtos armazenada no filegroup Secondary.

Bom pessoal, vou encerrar esta terceira sessão aqui, com o nosso ambiente pronto e preparado para começarmos os testes. Na próxima parte vamos iniciar a aplicação e execução dos Backups de Filegroup, demonstrando o que é necessário para realizar este tipo de procedimento.

Agradeço a sua visita, nos encontramos em breve, um bom feriado a todos.

Até mais.