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
sexta-feira, 17 de dezembro de 2010
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.
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;
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
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
Service Pack 2 SP2 do SQL Server 2008 está disponível para download
A Microsoft disponibilizou a versão final do Service Pack 2 (SP2) para download em: http://www.microsoft.com/downloads/details.aspx?FamilyID=8fbfc1de-d25e-4790-88b5-7dda1f1d4e17&displayLang=pt-br, uma das alterações nesta versão é a integração do Reporting Services com o Sharepint 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.
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
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.
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:
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.
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 |
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
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:
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:
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.
Como exemplo:
TABELA FUNCIONARIO | ||
ID | NOME | DT_NASC |
1 | João | 25/12/1980 |
2 | Maria | 04/04/1987 |
3 | Paulo | 29/09/1984 |
TABELA DEPENDENTE | |||
DEP_ID | FUNC_ID | NOME | RELACAO |
1 | 1 | Ana Maria | Conjuge |
2 | 1 | Ana Paula | Filho(a) |
3 | 1 | João Jr | Filho(a) |
4 | 2 | Carlos | Conjuge |
5 | 3 | Pedro | Filho(a) |
6 | 3 | Julia | Filho(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ÁRIO | LISTA DE FILHOS(AS) |
João | Ana Paula, João Jr |
Maria | |
Paulo | Pedro, 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;
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.
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;
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.
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%')
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
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.
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
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
"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:
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.
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.
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.
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;
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;
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
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.
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.
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.
Assinar:
Postagens (Atom)