sexta-feira, 17 de dezembro de 2010

TechCenters e DevCenters da Microsoft

O Fabio Hara (http://www.fabiohara.com.br/) indicou os seguintes links técnicos da Microsoft.

Para facilitar o acesso aos nossos portais tecnicos de produtos e tecnologias criamos uma serie de links via encurtadores de URL. A ideia é facilitar o acesso aos nossos centros. Confirma abaixo a lista:

DevCenters:

.Net Framework -> http://bit.ly/msdndotnet
ASP.NET -> http://bit.ly/msdnaspnet
Silverlight -> http://bit.ly/msdnsilverlight
Azure -> http://bit.ly/msdnazure
Visual Studio -> http://bit.ly/msdnvisualstudio
C# -> http://bit.ly/msdncsharp
IE -> http://bit.ly/msdnie
Office -> http://bit.ly/msdnoffice
Segurança -> http://bit.ly/msdnseguranca
SQL Server -> http://bit.ly/msdnsql

TechCenters:

Exchange Server -> http://bit.ly/technetexchange
Forefront -> http://bit.ly/technetforefront
Office -> http://bit.ly/technetoffice
SharePoint -> http://bit.ly/technetsharepoint
SQL Server -> http://bit.ly/technetsql
System Center -> http://bit.ly/technetsystemcenter
Windows -> http://bit.ly/technetwindows
Windows Server -> http://bit.ly/technetwindowsserver
TI Verde -> http://bit.ly/technettiverde
Interop -> http://bit.ly/technetinterop
Virtualização -> http://bit.ly/technetvirtualizacao
Licenciamento -> http://bit.ly/technetlicenciamento

terça-feira, 9 de novembro de 2010

Liberada versão CTP1 do SQL Server 2011 - Codinome "Denali"

A Microsoft anunciou a versão CTP1 (Community Technology Preview 1) do SQL Server 2011 que possui o codinome Denali.

Quem quiser fazer testes e conhecer as novidades pode fazer o download em: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6a04f16f-f6be-4f92-9c92-f7e5677d91f9

Nos próximos posts as novidades desta versão.

segunda-feira, 1 de novembro de 2010

Utilizando Filtered Index no SQL Server

A partir da versão 2008 do SQL Server existe um recurso muito interessante para a criação de índices, a utilização de filtros selecionando somente uma parte dos registros da tabela.

Esta opção cria índices mais enxutos com menos custo de manutenção e principalmente mais agilidade na seleção dos dados porque tem que tratar menos informações.

Exemplos de utilização: em tabelas históricas onde as consultas serão realizadas principalmente nos dados mais recentes, ou desprezar registros que tenham nulos em uma determinada coluna.

Para utilizar esta opção, basta acrescentar a cláusula WHERE com a expressão da seleção dos registros que deverão compor o índice.

Exemplos:

Criando um índice somente com as notas de 2010
CREATE NONCLUSTERED INDEX IN_NOTAS2010
ON NOTASFISCAIS
WHERE DATANOTA BETWEEN '01-JAN-2010' AND '31-DEC-2010';


Criando um índice somente com os funcionários ativos (sem data de rescisão)
CREATE NONCLUSTERED INDEX IN_FUNCIONARIOSATIVOS
ON FUNCIONARIOS
WHERE DATARESCISAO IS NOT NULL;

sexta-feira, 8 de outubro de 2010

Formatação de números com zeros à esquerda no SQL Server

Existem várias situações onde precisamos formatar números com zeros à esquerda para apresentar um uma consulta, para linhar e classificar corretamente um campo.

Considerando a seguinte tabela:

Create Table Teste (Codigo  int, Nome Varchar(40));

Insert into Teste Values(1,'José da Silva');
Insert into Teste Values(2,'Maria da Silva');
Insert into Teste Values(100,'Eusébio Queiroz');
Insert into Teste Values(1000,'Lucas Laranjeira');
Insert into Teste Values(200,'Judith Lima');


Se consultarmos da seguinte forma os dados:

Select Codigo, Cast(Codigo as Varchar(5)) 'CodigoAlfa', Nome
  From Teste
 Order By Cast(Codigo as Varchar(5));


Teremos o seguinte resultado:

Codigo    CodigoAlfa    Nome
1                          1        José da Silva
100                  100        Eusébio Queiroz
1000              1000        Lucas Laranjeira
2                          2        Maria da Silva
200                  200        Judith Lima

Observe que numericamente fica desordenado quando classificamos o número como varchar.
Para resolver esta situação altere a formatação do campo acrescentando os zeros à esquerda do número conforme a consulta:

Select Codigo, RIGHT('0000'+ CONVERT(VARCHAR,Codigo),5) 'CodigoAlfa', Nome
  From Teste
  Order By RIGHT('0000'+ CONVERT(VARCHAR,Codigo),5)

O resultado agora fica desta forma:

Codigo    CodigoAlfa    Nome
1                  00001        José da Silva
2                  00002        Maria da Silva
100              00100        Eusébio Queiroz
200              00200        Judith Lima
1000            01000        Lucas Laranjeira

terça-feira, 5 de outubro de 2010

segunda-feira, 27 de setembro de 2010

Como duplicar uma tabela no SQL Server

Para duplicar a estrutura e os dados de uma tabela no SQL Server, basta utilizar o operador INTO em um Select, por exemplo:

SELECT * INTO NOTASCOPIA
   FROM NOTAS

Será criada uma tabela NOTASCOPIA com os dados da tabela NOTAS e com os mesmos campos e definições.

quinta-feira, 23 de setembro de 2010

E-book Gratuito do SQL Server 2008 R2

No link a seguir tem como fazer o download de um e-book gratuito sobre o SQL Server 2008 R2, escrito por Ross Mistry e Stacia Misner.

Este livro mostra as principais novidades desta versão do SQL Server.

https://profile.microsoft.com/RegSysProfileCenter/wizard.aspx?wizid=bd9adb0f-cca3-4096-96f1-f834754d1b0b&lcid=1033

quinta-feira, 9 de setembro de 2010

Como carregar um arquivo texto para uma tabela no SQL Server

Umas das formas de carregar um arquivo texto para uma tabela no SQL Server é o utilitário bcp.
Para facilitar o entendimento, vou criar um exemplo de um arquivo com três campos delimitados por “;” que devem ser carregados em uma tabela que utilizará somente dois destes campos.

Definição da Tabela:

CREATE TABLE CONTAS
      (REDUZIDA VARCHAR(6),
       COMPLETA VARCHAR(12));

Arquivo exemplo:

000001;Conta Teste;100020003000
000002;Conta Despesas;200020003000
000003;Conta Salários;300020003000

Para fazer a importação vou gerar um arquivo onde é especificado o formato que o arquivo texto possui e onde cada campo deve ser importado. Para facilitar utilizaremos o bcp para gerar o arquivo a partir da tabela que irá receber os campos com a seguinte instrução:

bcp database.dbo.CONTAS format nul -T –n Contas.fmt –S Servidor\Instância –U usuário –P Senha

Altere “database.dbo” pelo banco de dados e o schema onde a tabela está definida.

Este comando irá gerar um arquivo com o seguinte conteúdo:

10.0
2
1 SQLCHAR 2 6 "" 1 REDUZIDA Latin1_General_CI_AS
2 SQLCHAR 2 35 "" 2 COMPLETA Latin1_General_CI_AS

Sendo a primeira linha a versão do banco de dados.
A segunda linha indica a quantidade de campos do arquivo.
A terceira e a quarta são as definições dos campos da tabela.
Neste exemplo vamos desprezar a descrição da conta para isto será inserido uma definicação de campo antes do campo “COMPLETA”, o arquivo ficará com o seguinte conteúdo:

10.0
3
1 SQLCHAR 0 6 ";" 1 REDUZIDA Latin1_General_CI_AS
2 SQLCHAR 0 35 ";" 0 DESPREZAR Latin1_General_CI_AS
3 SQLCHAR 0 35 "\r\n" 2 COMPLETA Latin1_General_CI_AS

Alterações realizadas:
  • Alterada a segunda linha para indicar que o arquivo tem três campos.
  • Incluída a definição do segundo campo e indicado que a posição dele na tabela é zero, ou seja não será importado.
  • Alterada a definição do campo COMPLETA para indicar que é o terceiro campo do arquivo, mantendo que ele está na segunda posição da tabela (sexta coluna do arquivo).
  • Incluído o delimitador de campos “;”, que no último campo é o final de linha do arquivo.


Figura 1
  
 Na figura 1 tem uma explicação do formato do arquivo retirado do manual do SQL Server.






Agora que temos o formato definido, abaixo está o comando que realiza a importação:

bcp database.dbo.CONTAS in arquivo.txt -f contas.fmt –U usuário –P senha –S servidor\instância

Este utilitário também serve para exportar os dados em arquivo texto.

Existem diversas outras opções tais como: pegar somente um pedaço do arquivo, outras formas de autenticação e utilizar arquivos de formato no padrão XML.

quarta-feira, 18 de agosto de 2010

Evento Discovery Informix Brasil - Agosto/2010

Semana que vem ocorrerá o Discovery Informix Brasil, evento que apresentará os recursos e as novidades deste banco de dados, e que contará com as presenças de:


Jerry Keesee - Director of Informix Database Development - ("o cara que faz o informix")
Stuart Litel - International Informix Users Group – President
Miguel Carbone - International Informix Users Group – Board of Directors

Agenda:

Dia 26/08/2010 - São Paulo
Dia 27/08/2010 - Rio de Janeiro
Dia 31/08/2010 - Belo Horizonte

Maiores detalhes em:

http://www.imartins.com.br/informix/artigos/evento-discovery-informix-sao-paulo-rio-janeio-belo-horizonte
http://informixbr.blogspot.com/2010/08/evento-informix-em-2608-nao-perca.html

sábado, 7 de agosto de 2010

Concatenar strings em registros diferentes - WM_Concat

Na sua empresa há uma tabela de Funcionários e outra de dependentes, conjuge, filhos, etc...) de cada funcionário. Há, portanto, duas tabelas: Funcionario( Func_ID, Nome, Dt_Nasc) e Dependente(Dep_ID, Func_ID, Nome, Relacao). É um tradicional relacionamento 1-N.

Como exemplo:

TABELA FUNCIONARIO
IDNOMEDT_NASC
1João25/12/1980
2Maria04/04/1987
3Paulo29/09/1984

TABELA DEPENDENTE
DEP_IDFUNC_IDNOMERELACAO
11Ana MariaConjuge
21Ana PaulaFilho(a)
31João JrFilho(a)
42CarlosConjuge
53PedroFilho(a)
63JuliaFilho(a)

Então, preparando uma festa de dia das crianças para os filhos do funcionário, alguém solicita um relatório com o nome do funcionário e o nome de todos seus filhos. Detalhe: todos em uma mesma coluna. Portanto, para atender à solicitação, teríamos:

RELATÓRIO DOS FILHOS
NOME DO FUNCIONÁRIOLISTA DE FILHOS(AS)
JoãoAna Paula, João Jr
Maria
PauloPedro, Julia

As tabelas de Funcionários e Dependentes podem ser criadas como views temporárias, apenas para uso nas queries de teste, pelo comando:

with funcionario as

(select 1 FUNC_ID, 'João' Nome, to_date('25/12/1980', 'dd/mm/yyyy') Dt_Nasc from dual union all
select 2 FUNC_ID, 'Maria' Nome, to_date('04/04/1987', 'dd/mm/yyyy') Dt_Nasc from dual union all
select 3 FUNC_ID, 'Paulo' Nome, to_date('29/09/1984', 'dd/mm/yyyy') Dt_Nasc from dual),
dependente as
(select 1 DEP_ID, 1 FUNC_ID, 'Ana Maria' Nome, 'Conjuge' Relacao from dual union all
select 2 DEP_ID, 1 FUNC_ID, 'Ana Paula' Nome, 'Filho(a)' Relacao from dual union all
select 3 DEP_ID, 1 FUNC_ID, 'João Jr' Nome, 'Filho(a)' Relacao from dual union all
select 4 DEP_ID, 2 FUNC_ID, 'Carlos' Nome, 'Conjuge' Relacao from dual union all
select 5 DEP_ID, 3 FUNC_ID, 'Pedro' Nome, 'Filho(a)' Relacao from dual union all
select 6 DEP_ID, 3 FUNC_ID, 'Julia' Nome, 'Filho(a)' Relacao from dual )


No Oracle há uma função não documentada, WM_CONCAT, que pode ser utilizada como uma função agregadora, da mesma forma que as habituais MAX, MIN, SUM e AVG. A query seria:

select f.nome, WM_CONCAT(d.nome)
  from funcionario f,
       dependente d
 where f.func_id = d.func_id
   and d.relacao = 'Filho(a)'
 group by f.nome;

Os valores são separados por vírgula. Caso seja necessário, a função REPLACE pode substituir a vírgula. eu usei para acrescentar um espaço após a vírgula, deste modo:

select f.nome, replace(WM_CONCAT(d.nome), ',', ', ')
  from funcionario f,
       dependente d
 where f.func_id = d.func_id
   and d.relacao = 'Filho(a)'
 group by f.nome;

Por último, uma palavra de precaução: como esta função não é documentada, a Oracle tem liberdade para numa próxima versão alterar o funcionamento ou simplesmente removê-la. Sendo assim, utilizá-la numa query para atender um demanda momentânea é seguro. Já utilizá-la em uma solução definitiva ou que deva rodar em várias versões de Oracle, é menos recomendável.

terça-feira, 6 de julho de 2010

Funções Agregadas em janelas no SQL Server

Depois dos posts do Miguel procurei no SQL Server um recurso similar ao explicado por ele das janelas para funções agregadas. No SQL Server existe o OVER, entretanto com opções mais limitadas, não existindo a cláusula RANGE.
Para conseguir o mesmo resultado tive que utilizar sub-queries, o que tira toda a facilidade da operação. Para exemplificar o terceiro exemplo do Oracle apresentado pelo Miguel que tinha o seguinte SQL (http://sqlbrasil.blogspot.com/2010/07/funcoes-agregadas-em-janelas-no-oracle.html):

Select as_of_date, pais, num_users,
     sum(num_users) over(partition by pais
     order by as_of_date
     range extract(day from as_of_date)-1 preceding ) acum_mes
from tst_janela3
order by 1,2;
 
tive que resolver da seguinte maneira no SQL Server:
 
Select as_of_Date, pais, num_users,
      (Select sum(num_users)
         from tst_Janela3 b
       where b.as_of_date >= a.as_of_date - DAY(a.as_of_date) + 1
          and b.as_of_date <= a.as_of_date
          and a.pais = b.pais) as acum_mes
from tst_janela3 a
order by 1, 2;

segunda-feira, 5 de julho de 2010

Funções agregadas em janelas no Oracle - parte III (final)

Para concluir esta pequena série de posts, vou utilizar uma terceira tabela de exemplo. Nela, há o número de acessos por usuário a cada dia, divididos por diferentes países (Brasil, EUA e Canadá):

create table tst_janela3 as

select 'BRASIL' pais,
        to_date('31-12-2009', 'dd-mm-yyyy')+level as_of_date,           
        trunc( dbms_random.VALUE(100, 200) ) num_users
from dual
connect by level <= 365
union all
select 'EUA' pais,
       to_date('31-12-2009', 'dd-mm-yyyy')+level as_of_date,        
       trunc( dbms_random.VALUE(100, 200) ) num_users
from dual
connect by level <= 365
union all
select 'CANADA' pais,
       to_date('31-12-2009', 'dd-mm-yyyy')+level as_of_date,
       trunc( dbms_random.VALUE(100, 200) ) num_users
from dual
connect by level <= 365;

O requisito é praticamente o mesmo: obter o total de acessos acumulados a cada dia, contando sempre do dia primeiro do mês até o dia em questão. Ou seja, em 14/Março, deve-se obter a soma de acessos do dia 01/Março até 14/Março. No dia 15/Março, do dia 1o. até 15.  Em 01/Abril, "zera" o acumulador e começa a somar novamente.

Considerando apenas um país, a consulta adequada está abaixo. A janela utilizada é o dia-1. O "-1" é necessário para não incluir no cálculo o último dia do mês anterior, afinal no dia 15/Março precisamos somar os 14 dias precedentes e o corrente.

select as_of_date,

       num_users,
       sum(num_users) over(order by as_of_date
                           range extract(day from as_of_date)-1 preceding ) acum_mes
from tst_janela3
where pais = 'BRASIL';


Muito bem, mas o requisito não inclui o filtro para BRASIL. É necessário o valor para cada dia, para cada país. Nesta caso, deve-se utilizar a claúsula PARTITION BY, para manter os valores separados por país:

select as_of_date,
       pais,
       num_users,
       sum(num_users) over(partition by pais
                           order by as_of_date
                           range extract(day from as_of_date)-1 preceding ) acum_mes
from tst_janela3
order by 1,2;

Como todas funções analíticas, as consultas em janelas podem ser especialmente úteis em queries de relatórios e queries para alimentar sistemas de Data Warehouse. Até onde sei, são um recurso exclusivo do Oracle, mas o César, meu colega de blog, vai tentar provar que é simples fazer com o Microsoft SQL Server.

domingo, 27 de junho de 2010

Funções agregadas em janelas no Oracle - parte II

A janela pode ser especificada de diversas formas. Uma relação completa pode ser encontrada no manual da Oracle, a partir da versão. Aqui coloco uma lista parcial das alternativas:

BETWEEN x PRECEDING AND y FOLLOWING
BETWEEN x PRECEDING AND y PRECEDING
BETWEEN CURRENT ROW AND y FOLLOWING
BETWEEN x PRECEDING AND CURRENT ROW
BETWEEN x PRECEDING AND UNBOUNDED FOLLOWING
BETWEEN UNBOUNDED PRECEDING AND y FOLLOWING
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
 
Por default, a última alternativa (em verde) é utilizada. Um detalhe, no exemplo que estou utilizando, há apenas um registro para cada dia. Assim, '10' PRECEDING representa os últimos 10 dias. Se houvesse um número de registros variável para cada dia, a janela deve ser especificada como um intervalo.
 
INTERVAL 'nn' DAY PRECEDING
INTERVAL 'nn' SECONDS FOLLOWING
INTERVAL 'nn' MONTH PRECEDING
 
Para exemplificar utilizo outra tabela com duzentos registros distribuídos aleatoriamente no mês de Janeiro.
 
create table tst_janela2 as
select to_date('31-12-2009', 'dd-mm-yyyy')+trunc(dbms_random.value(1,31)) as_of_date, trunc( dbms_random.VALUE(100, 200) ) num_users
from dual
connect by level <= 200;
 
O requisito é obter a média do número de usuários nos últimos 7 dias (6 precedentes e o dia corrente). A consulta é:
 
select distinct as_of_date,

sum(num_users) over (order by as_of_date
range interval '6' day preceding) media_semanal
from tst_janela2
order by 1;

Um último detalhe: digamos que, nesta resposta, é necessário obter o valor apenas para os sábados. A consulta acima deve ser uma visão (subconsulta) da principal. Se acrescentar um filtro (apenas sábados)  na clausula WHERE da consulta interna, as linhas dos demais dias da semana são retiradas do cálculo e o resultado final não será o desejado. Portanto, o correto é:

select as_of_date, media_semanal

from(
select distinct as_of_date,
sum(num_users) over (order by as_of_date
range interval '6' day preceding) media_semanal
from tst_janela2)
where to_char(as_of_date, 'D') = 7
order by 1;

sexta-feira, 25 de junho de 2010

Funções agregadas em janelas no Oracle - parte I

É bastante conhecida a utilização de funções agregadas em SQL, como MIN, MAX, SUM e AVG, mas o Oracle oferece um recurso interessante e bastante poderoso: definir um intervalo (janela) para a função. Começo com um exemplo bem simples, baseado em uma tabela que contém um registro para cada dia do ano:

create table tst_janela as

select to_date('31-12-2009', 'dd-mm-yyyy')+level as_of_date, trunc( dbms_random.VALUE(100, 200) ) num_users
from dual
connect by level <= 365;


O objetivo é obter para cada dia, a média dos últimos 10 dias. Ou seja, em 01/Jan, o resultado é a média dos valores entre 1 e 10/Jan. Já em 25/Jan, a média entre valores de 16 a 25/Jan. A função a ser utilizada é AVG. O problema é como definir as linhas que devem ser consideradas no cálculo, já que elas variam a  cada dia. Esta é a "janela" (intervalo, conjunto de linhas) da função. A consulta abaixo resolve o problema:

select as_of_date,

sum(num_users) over (order by as_of_date
range between '10' preceding and current row) media_10dias
from tst_janela;


Fundamental é compreender bem como a segunda coluna é calculada. Sum(num_users) dispensa comentários, mas a claúsula seguinte é chave da solução. Order by as_of_date é o critério como as linhas devem ser ordenadas. Range between '10' preceding and current row estabelece a janela começando 10 linhas (dias) atrás e terminando na linha corrente.

quinta-feira, 24 de junho de 2010

Consulta Database que utiliza um arquivo no SQL Server

Para descobrir qual o banco de dados (database) que está utilizando um arquivo no SQL Server, utilize o seguinte SQL:


Select Name from sys.databases a
 Where Exists
        (Select 1 from sys.master_files b
         where a.database_id = b.database_id
            and b.physical_name like '%NomeArquivo%')

quarta-feira, 9 de junho de 2010

Trabalhando com Updatable Views no SQL Server - 2 de 2

Continuando post anterior (http://sqlbrasil.blogspot.com/2010/05/trabalhando-com-updated-views-no-sql.html)  vou demonstrar agora como criar Updatable Views no SQL Server:

Vamos criar um exemplo baseado em uma tabela de pedidos bem simplificada conforme instrução de create abaixo:

Create Table Pedidos

(DataPedido DateTime Not Null,
NroOrdem Int Not Null,
CodCliente Int,
ValorTotal Decimal(11,2),
Desconto Decimal(11,2),
DataEntrega DateTime,
Observacoes Varchar(80),
Primary Key (DataPedido, NroOrdem));

Vamos considerar "quebrar" esta tabela em três novas conforme a data do pedido
  • Pedidos até 01/01/2009
  • Pedido de 01/01/2009 até 31/12/2009
  • Pedidos posteriores a 31/12/2009
Na verdade para garantir que os dados respeitarão estas"regras devemos acrescentar uma CHECK CONSTRAINT, abaixo o início da criação das três novas tabelas, os outros campos ficam iguais a tabela original.

Create Table PedidosAte2008

(DataPedido DateTime Not Null CHECK (DataPedido < '01/01/2009'),
...
Create Table Pedidos2009

(DataPedido DateTime Not Null CHECK (DataPedido between '01/01/2009' and '31/12/2009'),
...
Create Table PedidosApos2009

(DataPedido DateTime Not Null CHECK (DataPedido > '31/12/2009'),

A seguir insira os dados nas tabelas "quebradas" conforme a check constraint:


Insert into PedidosAte2008
   Select * From Pedidos
   Where DataPedido < '01/01/2009';


Insert into Pedidos2009
Se fores utilizar a view com o mesmo nome da tabela original, renomeie ou exclua a tabela pedidos.
Agora basta criar a view "juntando" os dados das três tabelas:

Create View Pedidos
    With SchemaBinding
as
   Select DataPedido, NroOrdem, CodCliente,ValorTotal,Desconto,DataEntrega,Observacoes
    from dbo.PedidosAte2008
Union All
  Select DataPedido, NroOrdem, CodCliente,ValorTotal,Desconto,DataEntrega,Observacoes
   from dbo.Pedidos2009
Union All
   Select DataPedido, NroOrdem, CodCliente,ValorTotal,Desconto,DataEntrega,Observacoes
    from dbo.PedidosApos2009;

Com a view criada é possível utilizar Insert, Update e Delete nela que o SQL Server irá se basear na check constraint para identificar qual das três tabelas que deverá ser alterada.

Como no exemplo utilizamos o mesmo nome da tabela original, os programas que utilizavam a tabela Pedidos não precisarão ser alterados.

sexta-feira, 28 de maio de 2010

Versões gratuitas do Informix

Este mês coloquei um post sobre a nova versão gratuita do SQL Server 2008 R2 e recebi um comentário do meu xará César (DBA Informix - www.imartins.com.br/informix) comentando sobre o recente lançamento (25/05/2010) das versões gratuitas do Informix, que estou transcrevendo abaixo porque julguei bem interessante:

"Se tratando de banco de dados gratuitos, gostaria de informa-los dobre um anuncio que IBM fez esta semana:


Ela divulgou duas versões gratuitas para produção do Informix (isso agora, dia 25/Maio/2010). O Informix Innovator-C e Ultimate-C

A versão Innovator-C é mais restrita , limitada a 2GB memoria , 4 cores e certas restrições no DML. Porém disponível para *todas* plataformas.

A versão Ultimate-C é mais parruda, suporta até 4 sockets/16cores , 16GB de memoria . Porém disponível apenas para Windows e MacOS.

AMBAS: Permitem 1 nós de clustar ATIVO-ATIVO, tamanho de banco de dados ILIMITADO e sem limite de conexões.

Para maiores informações:

http://www.ibm.com/informix
http://www.imartins.com.br/informix/artigos/fix-1150-xc7-disponivel-aqui-revolucao-comeca
http://informix-technology.blogspot.com/2010/05/new-informix-editions-bargain-time.html
http://www.ibm.com/developerworks/data/library/techarticle/dm-0801doe/index.html

terça-feira, 25 de maio de 2010

Trabalhando com Updatable Views no SQL Server - 1 de 2

No SQL Server podemos criar views que permitam atualização de suas informações, recurso que também existem em outros bancos de dados como o Oracle.

A diferença no SQL Server frente ao Oracle é que podemos também atualizar views que utilizam consultas com o operador UNION do SELECT. O SQL Server através de constraints definidas na criação das tabelas consegue identificar qual a tabela correta onde ele deve incluir, alterar e excluir os dados.

E qual a vantagem disto?

Bom sabe aquelas tabelas com milhões de dados armazenados com dados históricos desde a implantação do sistema, pois bem exatamente elas são ótimas candidatas para utilizar este recurso, porque permite que ela seja dividida em vários "pedaços" diminuindo a quantidade de registros que o SQL Server pesquisa quando consultamos parcialmente os dados.

Como funcionaria:
  • Quebre a tabela existente em diversas tabelas com os diferentes níveis de acesso aos dados, ou com históricos anuais, ou semestrais, etc; conforme os dados que estão na tabela.  
  • Depois crie uma view “juntando” os dados de todas estas tabelas com o nome original da tabela. Desta forma não é necessário alterar as referências existentes nos sistemas para os dados.
  • Em consultas com seleção pelo campo da constraint, possibilita ao otimizador do SQL Server buscar as informações somente na tabela onde eles estão evitando que sejam considerados todos os dados originais.
No próximo post vou demonstrar como criar esta estrutura.

terça-feira, 11 de maio de 2010

Tech-Ed 2010

O principal evento da Microsoft no Brasil será realizado em setembro/2010, é o Tech-Ed, nos dias 13, 14  e 15.
Vale a pena conferir, tem palestras das principais ferramentas da Microsoft com demonstrações práticas, discutindo tendências e novidades em todas as áreas onde a empresa atua.
No site do evento http://www.teched.com.br/ tem um mailing para ficar atualizado sobre as novidades do evento.

sábado, 8 de maio de 2010

SQL Server 2008 R2 Express

Mês passado a Microsoft disponibilizou a versão oficial do SQL Server 2008 R2. Uma alteração importante na versão Express (gratuita), é que o limite de tamanho da Database que era de 4 Gb na versão anterior, alterou para 10 Gb. É possível baixar este versão gratuita no endereço: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=967225eb-207b-4950-91df-eeb5f35a80ee

segunda-feira, 19 de abril de 2010

Base Firebird Corrompida

Quando temos o desprazer de nos deparar com uma base corrompida no Firebird podemos tentar alguns procedimentos que podem vir a recuperar o banco de dados, algumas vezes perdendo informações dependendo do tamanho do problema, abaixo algumas dicas:

gfix -v -f -user sysdba -password masterkey arquivo.fbd
gfix -m -i -user sysdba -password masterkey arquivo.fbd

backup e restore do banco de dados com o utilitário gbak.

Em algumas situações ao restaurar o banco de dados ocorrem problemas com as chaves estrangeiras, porque estão inconsistentes.
Um procedimento que pode ser feito neste caso é restaurar sem ativar elas:

gbak -user sysdba -password masterey -i -r arquivo.fbk arquivo.fbd

Depois deste procedimento o ideal é criar um novo banco de dados somente com os objetos criados (tabelas, views, funções, ...) e copiar as informações para ela.

Antes de mais nada caso exista um backup atualizado, muitas vezes o melhor caminho é utilizar ele antes de fazer estes procedimentos, porque como disse, conforme o tamanho do problema, talvez algumas informações sejam perdidas, e não tem como saber tudo que pode ter sido perdido.

terça-feira, 6 de abril de 2010

Login bloqueado no SQL Server

Quando um login fica bloqueado no SQL Server ao utilizar a autenticação do SQL Server, e mesmo desmarcando a opção "Login is locked out" não libera o usuário. Verifique se não está ativa a opção de policies para as senhas da autenticação do SQL Server. Neste caso pode ser que a política está obrigando a troca de senha do usuário.

terça-feira, 30 de março de 2010

Consulta do código de uma procedure no Oracle

Caso você precise consultar o código de uma procedure no Oracle utilize a seguinte instrução:

Select TEXT
From USER_SOURCE
Where NAME = 'Nome_Procedure'
Order by LINE;

sexta-feira, 19 de março de 2010

Consulta a v$session em triggers no Oracle

Se ao consultar a view v$session (view com informações das sessões do Oracle)dentro de uma trigger, ocorrer o erro de tabela ou view inexistente, a solução é dar grant para o usuário que irá disparar a trigger, por exemplo:

connect / as sysdba;
grant select on v_$session to usuário;

Observe que é v_$session e não v$session no grant;

terça-feira, 16 de fevereiro de 2010

Vídeo-aula: Utilizando SQL Profiler e o Performance Monitor juntos



Aprenda nesta vídeo-aula a utilizar as ferramentas SQL Profiler (SQL Server) e o Performance Monitor (Windows) juntas para analisar problemas de desempenho em servidores SQL Server:
http://www.youtube.com/watch?v=p0X-bTi5Ttw

quinta-feira, 4 de fevereiro de 2010

Erro no Sharepoint: "Não foi possível converter algumas ou todas as referências de identidade"

Estava trabalhando em uma instalação Sharepoint que começou a apresentar o seguinte erro na administração central da ferramenta: "Não foi possível converter algumas ou todas as referências de identidade".
Este mesmo problema estava impedindo que fosse instalado os modelos do 40 fantásticos com o erro: "Object reference not set to an instance of an object".
No meu caso este erro indicava problemas nas credenciais registradas no Farm do Sharepoint, para resolver executei a seguinte instrução:

stsadm.exe -o updatefarmcredentials -userlogin domínio\usuário -password senha

sábado, 30 de janeiro de 2010

Consulta da última instrução executada por uma sessão no Oracle

Quando for necessário consultar qual a última instrução executada por uma sessão do Oracle, podemos utilizar as views do dicionário do Oracle para obter esta informação:

SELECT DISTINCT A.PIECE, A.SQL_TEXT

  FROM V$SQLTEXT_WITH_NEWLINES A, V$SESSION B, V$OPEN_CURSOR C
WHERE RAWTOHEX(A.ADDRESS) = RAWTOHEX(C.ADDRESS)
     AND A.HASH_VALUE = C.hash_value
     AND B.SID= NumeroDaSessaoOracle
     AND B.SID = C.SID (+)
     AND B.SQL_ADDRESS = C.ADDRESS (+)
Order by PIECE

   Altere o NumeroDaSessaoOracle pelo código da sessão que desejas consultar. Para obter este número consulte a view V$Session.

domingo, 10 de janeiro de 2010

Microsoft Pivot

A Microsoft liberou para testes uma nova ferramenta para consultar informações na internet combinando itens similares, criando relacionamentos entre eles e demonstrando de uma nova forma estes dados.
Fiz alguns testes e a ferramenta é muito interessante, existe a restrição de somente funcionar em Windows com a linguagem configurada  para o Inglês.
Para maiores detalhes vá em: http://www.getpivot.com/, lá tem um vídeo com maiores explicações e uma demo. É necessario conseguir um convite para testar a ferramenta.