Lomadee, uma nova espécie na web. A maior plataforma de afiliados da América Latina.

quarta-feira, 14 de dezembro de 2011

Word e Excel - Modo de Exibição Protegido


Modo de Exibição Protegido
No MS Office 2010, ao abri um arquivo no formato Word ou Excel vindo anexado de um e-mail, internet ou rede, aparece a mensagem “Modo de Exibição Protegido”, como na imagem abaixo.
Para desabilitar essa mensagem no Word ou Excel, pasta ir ao menu Arquivo\Opções
Na tena de Opões, vá ao menu “Central de Confiabilidade”

Na tela da central de confiabilidade, vá ao menu “Modo de exibição protegido”

Basta desmarcarmo as caixas de seleção para desabilitar a exibição da mensagem.

Anderson

segunda-feira, 12 de dezembro de 2011

Mapeando Dados Oracle para SQL Server

Mapeamento de tipo de dados para Publicadores Oracle

SQL Server 2008 R2
Tipos de dados de Oracle e tipos de dados de MicrosoftSQL Server nem sempre correspondem exatamente. Onde possível, o tipo de dados correspondente é selecionado automaticamente ao publicar uma tabela de Oracle. Em casos em que o mapeamento de um único tipo de dados não é claro, mapeamentos alternativos de tipo de dados são fornecidos. Para obter informações sobre como selecionar mapeamentos alternativos, consulte "Especificando Mapeamentos Alternativos de Tipos de Dados”, mais adiante neste tópico.
A tabela a seguir mostra como os tipos de dados são mapeados por padrão entre o Oracle e o SQL Server quando os dados são movidos de um Publicador Oracle para o Distribuidor do SQL Server. A coluna de Alternativas indica se mapeamentos alternativos estão disponíveis.
Tipo de dados de OracleTipos de dados SQL ServerAlternativas
BFILEVARBINARY(MAX)Sim
BLOBVARBINARY(MAX)Sim
CHAR([1-2000])CHAR([1-2000])Sim
CLOBVARCHAR(MAX)Sim
DATEDATETIMESim
FLOATFLOATNão
FLOAT ([1-53])FLOAT ([1-53])Não
FLOAT ([54-126])FLOATNão
INTNUMERIC(38)Sim
INTERVALDATETIMESim
LONGVARCHAR(MAX)Sim
LONG RAWIMAGESim
NCHAR([1-1000])NCHAR([1-1000])Não
NCLOBNVARCHAR(MAX)Sim
NUMBERFLOATSim
NUMBER([1-38])NUMERIC([1-38])Não
NUMBER([0-38],[1-38])NUMERIC([0-38],[1-38])Sim
NVARCHAR2 ([1-2000])NVARCHAR([1-2000])Não
RAW ([1-2000])VARBINARY([1-2000])Não
REALFLOATNão
ROWIDCHAR([1-2000])Não
TIMESTAMPDATETIMESim
TIMESTAMP(0-7) DATETIMESim
TIMESTAMP(8-9) DATETIMESim
TIMESTAMP(0-7) WITH TIME ZONEVARCHAR(37)Sim
TIMESTAMP(8-9) WITH TIME ZONEVARCHAR(37)Não
TIMESTAMP(0-7) WITH LOCAL TIME ZONEVARCHAR(37)Sim
TIMESTAMP(8-9) WITH LOCAL TIME ZONEVARCHAR(37)Não
UROWIDCHAR(18)Não
VARCHAR2([1-4000])VARCHAR([1-4000])Sim
Pense nos seguintes problemas de tipo de dados ao replicar dados de um banco de dados de Oracle.

Tipos de dados sem suporte

Os seguintes tipos de dados não têm suporte; não podem ser replicadas as colunas que têm estes tipos:
  • Tipos de objeto
  • Tipos XML
  • Varrays
  • Tabelas aninhadas
  • Colunas que usam REF

O tipo de dados de DATE.

As datas no SQL Server vão de 1753 a.C. a 9999 d.C. enquanto as datas no Oracle vão de 4712 a.C. a 4712 d.C. Se uma coluna do tipo DATE contém valores que estão fora do intervalo do SQL Server, selecione um tipo de dados alternativo para a coluna, que é VARCHAR(19).

Tipos FLOAT e NUMBER

A escala e precisão especificadas durante o mapeamento de tipos de dados FLOAT e NUMBER dependem da escala e precisão especificadas para a coluna usando o tipo de dados no banco de dados do Oracle. A precisão é o número de dígitos em um número. A escala é o número de dígitos à direita da casa decimal em um número. Por exemplo, o número 123,45 tem uma precisão de 5 e uma escala de 2.
O Oracle permite números a serem definidos com a escala maior que a precisão, tal como NUMBER(4,5), mas o SQL Server requer que a precisão seja igual ou maior que a escala. Para garantir que não há truncamento de dados, se a escala for maior que a precisão no Publicador Oracle, a precisão é definida igual à escala quando o tipo de dados for mapeado: NUMBER (4,5) ele seria mapeado como NUMERIC (5,5).
Observação Observação
Se você não especificar a escala e a precisão para NUMBER, o SQL Server usa o padrão máximo de escala (8) e precisão (38). É recomendável que você defina uma escala e precisão específicas no Oracle para melhor armazenamento e desempenho quando os dados forem replicados.

Tipos de objeto grande

O Oracle suporta até 4 gigabytes (GB), enquanto que o SQL Server suporta até 2 GB. Dados replicados acima de 2 GB são truncados.
Se uma tabela de Oracle incluir uma coluna de BFILE, os dados para a coluna serão armazenados no sistema de arquivos. A conta do usuário administrativo da replicação deve receber acesso ao diretório no qual os dados estão armazenados usando a seguinte sintaxe:
GRANT READ ON DIRECTORY <directory_name> TO <replication_administrative_user_schema>
Para obter mais informações sobre tipos de objetos grandes, consulte a seção "Considerações sobre objetos grandes" em Considerações de design e limitações para Editores Oracle.
Tipicamente, o padrão de mapeamento de tipo de dados é apropriado, porém para muitos tipos de dados do Oracle, você pode selecionar um mapeamento de tipo de dados a partir de um conjunto de mapeamentos alternativos, ao invés de usar o padrão. Há dois modos para especificar os mapeamentos alternativos:
  • Substitua o padrão em uma base por artigo usando procedimentos armazenados ou o Assistente para Nova Publicação .
  • Globalmente altere o padrão para todos os artigos futuros usando procedimentos armazenados (não são alterados os padrões para os artigos existentes).
Para especificar mapeamentos alternativos de tipo de dados

Oracle - Trabalhando com datas

SELECT SYSDATE DATA_ATUAL,
ADD_MONTHS(SYSDATE,-1) MENOS_UM_MES,
ADD_MONTHS(SYSDATE,1) MAIS_UM_MES,
LAST_DAY(SYSDATE) ULTIMO_DIA_MES,
TRUNC(SYSDATE,"MONTH") PRIMEIRO_DIA_MES,
MONTHS_BETWEEN(SYSDATE,"01-JAN-2001") QTD_MES,
FLOOR(MONTHS_BETWEEN(SYSDATE,"01-JAN-2001")) ARREDONDA_ABAIXO,
CEIL(MONTHS_BETWEEN(SYSDATE,"01-JAN-2001")) ARREDONDA_ACIMA,
ABS(MONTHS_BETWEEN(SYSDATE,"01-JAN-2001")) VALOR_ABSOLUTO,
ROUND((MONTHS_BETWEEN(SYSDATE,"01-JAN-2001")),2) ARREDONDA,
TRUNC(SYSDATE,"year") PRIMEIRO_DIA_ANO,
to_char(SYSDATE,"dd " DE " FMMONTH " DE " YYYY","nls_date_language=portuguese") DIAMES_EXTENSO,
to_char(SYSDATE,"FMMONTH " DE " YYYY","nls_date_language=portuguese") MES_EXTENSO,
TO_CHAR(SYSDATE,"HH24:MI") HORA_MINUTO,
to_char(sysdate,"FMMonth","nls_date_language=portuguese") mes_corrente,
to_date(lpad(to_char(1234),4,"0"),"hh24mi") dias_data,
Floor(floor(months_between(SYSDATE,SYSDATE)) / 12) IDADE,
decode(TO_NUMBER(TO_CHAR(SYSDATE,"D")),2,"segunda-feira",3,"terça-feira",4,"quarta-feira",
5,"quinta-feira",6,"sexta-feira",7,"sabado",1,"domingo") dia_da_semana
FROM DUAL

fonte: http://www.linhadecodigo.com.br/Dica.aspx?id=1292

SQL Server - Views Indexadas

Melhorando desempenho de consultas utilizando Views Indexadas

O artigo tem o objetivo de ensinar a utilização e criação de Views Indexadas, mostrando a melhora de desempenho ao utilizá-la.


O artigo tem o objetivo de ensinar a utilização e criação de Views Indexadas, mostrando a melhora de desempenho ao utilizá-la. Para conseguir exemplificar com mais precisão, mostrarei os conceitos de utilização e criação de Views e Index independentemente um recurso do outro. Nos exemplos deste artigo, utilizaremos o banco AdventureWorks, que vem com o banco de exemplo do SQL Server 2005.
Aconselho fortemente que você pesquise no Books Online sobre a criação e uso de sintaxe de Views e Indexes. No artigo vou apresentar a melhora no desempenho e não sua sintaxe. No Books Online você irá encontrar um material rico e completo sobre estes recursos.
Entendendo o que é uma View
A criação de instruções de consulta é na maioria dos casos simples, mas quando repetidos diversas vezes os mesmos códigos, pode-se começar a ficar cansativa a sua criação.  Para armazenar estas consultas em banco, utiliza-se um recurso já antigo de bancos de dados chamado View. Uma View é uma representação virtual de uma tabela, e pode conter colunas de uma ou varias tabelas físicas ou até mesmo de outras Views. Na maioria das vezes, as Views não armazenam os dados em banco, elas consultam os dados que foram selecionados em suas tabelas de origem. É possível utilizar uma View em qualquer lugar onde se possa utilizar uma tabela.
Vamos criar uma View de exemplo, consultando as tabelas Product e ProductModel do banco AdventureWorks.
CREATE VIEW vw_ProdutoDescricao WITH SCHEMABINDING AS
SELECT P.ProductID Codigo, P.Name Descricao, M.Name Produto
FROM Production.Product P INNER JOIN
      Production.ProductModel M
  ON P.ProductModelID = M.ProductModelID
Esta View irá retornar os dados relacionados entre as duas tabelas, e como não foi especificado nenhum Schema e neste caso estou conectado ao banco como usuário SA(System Administrator), a View irá assumir que o Schema é o do DBO.
Abaixo estão as sessões de Views do banco AdventureWorks, que exibe onde ficam armazenados todos objetos Views deste banco. Repare que na imagem da esquerda exibe o banco sem a View que criamos, e na imagem da direita, já apresenta a View criada.
Para ativar o retorno das estatísticas de IO (Input/Output), e solicitar que seja exibido na aba de Messages não somente a quantidade de linhas que foram retornadas, mas também quais tabelas foram acessadas e quantas leituras lógicas (Logical Reads) foram necessárias em cada tabela para conseguir atingir o resultado solicitado, devemos executar o código abaixo:
SET STATISTICS IO ON
Para executar a consulta que acabamos de criar, podemos chamar a View vw_ProdutoDescricao, fazendo um SELECT simples nela, como se fosse o de uma tabela.
SELECT * FROM vw_ProdutoDescricao
Repare que ao executar o SELECT na View, é apresentado o mesmo resultado da execução do SELECT nas tabelas que foram utilizadas em sua criação.
Pelo fato das estatísticas de IO estarem ativadas, o resultado é semelhante a este apresentado:
(295 row(s) affected)
Table "Worktable". Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table "Product". Scan count 1, logical reads 15, physical reads 1, read-ahead reads 14, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table "ProductModel". Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 
Neste exemplo são poucos dados que são armazenados na tabela de exemplo, mas já é possível visualizar que foram lidas 17 páginas de arquivos. Sendo 15 páginas da tabela Products e 2 páginas da tabela ProductModel.
O que é um Index?
O SQL Server é um banco de dados relacional, e em bancos de dados relacionais existe um recurso chamado Index (Indexação). O Index permite que o banco de dados acesse rapidamente linhas em uma tabela baseando-se nos valores de uma ou varias colunas. Para criar Index não se deve somente pensar em código T-SQL, Index é mais complicado do que isso. Criar um Index depende de estudo e análise das estruturas das tabelas para conseguir um resultado satisfatório. Caso você crie um Index em uma tabela que sofra muitas inserções de dados, o tempo para recalcular o Index pode ser mais demorado que se fosse executada uma consulta diretamente na tabela origem sem o Index.
Existem dois tips de Index, o Index Clustered e o Index Non-Clustered. O Index Clustered irá determinar a ordem física de armazenamento das linhas na tabela, diferente do Index Non-Clustered, que é um objeto dentro do banco de dados que aponta para uma linha dentro de uma tabela, mas não especifica como estas linhas devem estar armazenadas. Partindo do mesmo princípio da criação de Chaves Simples e Chaves Compostas em tabelas, os Index também podem ser simples ou composto. O Index simples é baseado em apenas uma coluna, enquanto o Index composto é baseado em duas ou mais colunas de uma tabela ou View.
A criação de um Index na View que criamos anteriormente será essencial para comprovar o que estou propondo no artigo. A melhora no desempenho.
CREATE UNIQUE CLUSTERED INDEX idx_ProdutoDescricao ON
vw_ProdutoDescricao(Codigo ASC) 
Após a criação, o Index vai ficar armazenado na sessão de Index da View de exemplo. Para visualizar os Index criados em cada View, expanda as opções da View criada anteriormente e em seguida expanda as opções relacionadas aos indexes. Este procedimento pode ser realizado tanto para Views quanto para tabelas.
Repare que o Index com o nome que criamos está presente nesta sessão.
Como funcionam Views Indexadas.
A possibilidade de criação de Index em Views, foi desenvolvida para a versão 2000 do SQL Server e melhorada para a versão 2005. Ao indexar uma View, os dados são armazenados em uma tabela virtual e são atualizados sempre que os dados de suas tabelas originais são alterados. Em vários casos, este recurso pode melhorar o desempenho, visto que os dados não precisarão ser “recalculados” sempre que forem consultados. As Views indexadas são recomendadas, quando os dados das tabelas que são utilizadas nas Views não sofrerem muitas alterações. No caso de existirem muitas alterações nos dados das tabelas, o tempo de processamento para montar o Index da View pode ser maior que o tempo para fazer a consulta sem Index às tabelas.
Executando a mesma consulta que foi realizada à View no exemplo anterior, e mantendo as estatísticas de IO ativas, é possível comparar a quantidade de páginas que foram utilizadas para atingir o mesmo retorno. Repare que o SQL Server interpreta a View como sendo uma tabela do banco de dados, e faz leitura em 6 páginas para retornar os dados cadastrados.
(295 row(s) affected)
Table "vw_ProdutoDescricao". Scan count 1, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 
A velocidade de retorno de uma consulta é proporcional à quantidade de páginas que o SQL Server 2005 necessita ler para conseguir o resultado. Quanto mais páginas forem lidas para mostrar o resultado de uma consulta, mais tempo vai levar para esta consulta ser completada.
Toda vez que o SQL Server 2005 realiza uma consulta, ele gera um plano de execução. Este plano de execução é armazenado em memória por um determinado tempo, e se for realizada esta mesma consulta enquanto o plano ainda existir, o SQL Server 2005 vai realizar a consulta de forma mais rápida. Para provar o que estou escrevendo, execute a instrução SELECT que originou a View (não é a execução da View, é a execução do SELECT que está dentro dela), esta instrução fará consulta à tabela vw_ProdutoDescricao, e vai consultar somente 6 páginas.
SELECT P.ProductID Codigo, P.Name Descricao, M.Name Produto
FROM Production.Product P INNER JOIN
      Production.ProductModel M
  ON P.ProductModelID = M.ProductModelID
No resultado da consulta, na sessão de Messages é apresentada a prova disso.
 
(295 row(s) affected)
Table "vw_ProdutoDescricao". Scan count 1, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
                                 
Neste artigo fico por aqui, apresentando a melhoria de performance ao utilizar Views indexadas. Espero que este artigo auxilie os desenvolvedores que necessitam melhorar o desempenho de consultas demoradas. Os dados apresentados são poucos, mas mesmo assim a melhora foi superior a 50%. Existem casos em que a melhora chega a ser de 90% ou mais.

fonte: http://www.linhadecodigo.com/ArtigoImpressao.aspx?id=1308

Oracle - Funções

Funções de valores simples:

ABS(n)= Devolve o valor absoluto de (n).
CEIL(n)=Obtém o valor inteiro imediatamente superior ou igual a "n".
FLOOT(n) = Devolve o valor inteiro imediatamente inferior ou igual a "n".
MOD (m, n)= Devolve o resto resultante de dividir "m" entre "n".
NVL (valor, expressão)= Substitui um valor nulo por outro valor.
POWER (m, exponente)= Calcula a potência de um número.
ROUND (numero [, m])= Arredonda números com o número de dígitos de precisão indicados.
SIGN (valor)= Indica o signo do "valor".
SQRT(n)= Devolve a raiz quadrada de "n".
TRUNC (numero, [m])= Trunca números para que tenham uma certa quantidade de dígitos de precisão.
VAIRANCE (valor)= Devolve a média de um conjunto de valores.

Funções de grupos de valores:

AVG(n)= Calcula o valor médio de "n" ignorando os valores nulos.
COUNT (* | Expressão)= Conta o número de vezes que a expressão avalia algum dado com valor não nulo. A opção "*" conta todas as filas selecionadas.
MAX (expressão)= Calcula o máximo.
MIN (expressão)= Calcula o mínimo.
SUM (expressão)= Obtém a soma dos valores da expressão.
GREATEST (valor1, valor2…)= Obtém o maior valor da lista.
LEAST (valor1, valor2…)= Obtém o menor valor da lista.

Funções que devolvem valores de caracteres:

CHR(n) = Devolve o caractere cujo valor em binário é equivalente a "n".
CONCAT (cad1, cad2)= Devolve "cad1" concatenada com "cad2".
LOWER (cad)= Devolve a cadeia "cad" em minúsculas.
UPPER (cad)= Devolve a cadeia "cad" em maiúsculas.
INITCAP (cad)= Converte a cadeia "cad" a tipo título.
LPAD (cad1, n[,cad2])= Adiciona caracteres à esquerda da cadeia até que tenha uma certa longitude.
RPAD (cad1, n[,cad2])= Adiciona caracteres à direita até que tenha uma certa longitude.
LTRIM (cad [,set])= Suprime um conjunto de caracteres à esquerda da cadeia.
RTRIM (cad [,set])= Suprime um conjunto de caracteres à direita da cadeia.
REPLACE (cad, cadeia_busca [, cadeia_substitucao])= Substitui um caractere ou caracteres de uma cadeia com 0 ou mais caracteres.
SUBSTR (cad, m [,n])= Obtém parte de uma cadeia.
TRANSLATE (cad1, cad2, cad3)= Converte caracteres de uma cadeia em caracteres diferentes, segundo um plano de substituição marcado pelo usuário.

Funções que devolvem valores numéricos:

ASCII(cad)= Devolve o valor ASCII da primeira letra da cadeia "cad".
INSTR (cad1, cad2 [, comeco [,m]])= Permite uma busca de um conjunto de caracteres em uma cadeia, mas não suprime nenhum caractere depois.
LENGTH (cad)= Devolve o número de caracteres de cad.

Funções para o manejo de datas:

SYSDATE=  Devolve a data do sistema.
ADD_MONTHS (data, n)= Devolve a data "data" incrementada em "n" meses.
LASTDAY (data)= Devolve a data do último dia do mês que contém "data".
MONTHS_BETWEEN (data1, data2)= Devolve a diferença em meses entre as datas "data1" e "data2".
NEXT_DAY (data, cad)= Devolve a data do primeiro dia da semana indicado por "cad" depois da data indicada por "data".

Funções de conversão:

TO_CHAR= Transforma um tipo DATE ou NUMBER em uma cadeia de caracteres.
TO_DATE= Transforma um tipo NUMBER ou CHAR em DATE.
TO_NUMBER= Transforma uma cadeia de caracteres em NUMBER.

fonte: http://www.criarweb.com/artigos/756.php

SQL Server - Trabalhando com data


First Day of Month


select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
 

First Day of Last Month


select DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm,-1,getdate())), 0)
 

Monday of the Current Week


select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
 

Sudday of the Current Week


set DATEFIRST 1

select DATEADD(dd, 1 - DATEPART(dw, getdate()), getdate())
 

First Day of the Year


select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
 

First Day of the Quarter


select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
 

Midnight for the Current Day


select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
 

Last Day of Prior Month


select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()  ), 0))
 

Last Day of Prior Year


select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()  ), 0))
 

Last Day of Current Month


select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()  )+1, 0))
 

Last Day of Current Year


select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()  )+1, 0))
 

First Monday of the Month


select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 0) 
 
 
DATEPART
Função usada para obter uma determinada parte de uma data como por exemplo o ano, mês, dia, hora, minuto, segundo, etc. Para utilizá-la pede-se dois parâmetros sendo o primeiro a parte da data e o segundo a data propriamente dita, repare que no exemplo abaixo usei no segundo parâmetro da função datepart a função getdate() usada para retornar a data atual do servidor.
DatePart
DATEDIFF
Função usada para obter a diferença de anos, meses, dias, horas, minutos, segundos, dentre outros entre duas datas. Para utilizá-la pede-se três parâmetros sendo o primeiro a parte da data o segundo a data inicial e o terceiro a data final, repare que no exemplo abaixo usei no segundo parâmetro da função datepart a função getdate() usada para retornar a data atual do servidor.
DateDiff
DATEADD
Função usada para adicionar anos, meses, dias, horas, minutos, segundos, dentre outros a uma data. Para utilizá-la pede-se três parâmetros sendo o primeiro a parte da data o segundo o valor ao qual será adicionado e o terceiro a data propriamente dita, repare que no exemplo abaixo usei no segundo parâmetro da função datepart a função getdate() usada para retornar a data atual do servidor.
DateAdd
CONVERT
No contexto do artigo esta função é usada para converter um campo ou variável do tipo data para uma string baseado em uma norma ou padrão do SQL Server. Para utilizá-la pedem-se dois parâmetros sendo o primeiro o tipo ao qual o dado será convertido que no nosso caso é um varchar, o segundo parâmetro é a data na qual será convertida e o terceiro parâmetro é a norma ou padrão do SQL Server listado abaixo, repare que no exemplo abaixo usei no segundo parâmetro da função datepart a função getdate() usada para retornar a data atual do servidor.
Abaixo listei todas as normas/padrões do SQL Server a questão agora é usar a que se encaixa melhor para cada tipo de situação.
Convert
fontes: 
 
http://shanecooper.net/cooldatefunctions.htm 
 
http://www.devmedia.com.br/articles/viewcomp.asp?comp=14015 

SQL Server - Data por Extenso – DateName

Script para retornar uma data por extenso.
 
SET LANGUAGE Português
 
SELECT DATENAME(weekday, GetDate()) + ‘, ‘   +
       DATENAME(day, GetDate())     + ‘ de ‘ +
       DATENAME(month, GetDate())   + ‘ de ‘ +
       DATENAME(year, GetDate())
 
 
Lembrar de utilizar o SET LANGUAGE para retornar a data no idioma desejado, para verificar o idioma padrão de sua sessão execute “DBCC UserOptions”
 
Para visualizar qual é o nome dos idiomas existentes no SQL verifique na coluna name da tabela sysLanguages.
select * from master.dbo.syslanguages
 
Obs.: Evite usar SET LANGUAGE dentro de procedures pois isso irá causar RECOMPILE.

fonte: http://blogfabiano.com/2008/04/24/data-por-extenso-datename/

Como resolver o erro ORA-01422

O erro oracle, em código PL-SQL, ORA-01422: exact fetch returns more than request number of rows, é retornado quando em uma única váriavel é tentado retornar mais de um valor, para acertar isso há várias formas dependendo da sua necessidade, vamos a alguns casos: 1 – Query não deve retornar mais de um registro
Vamos a uma situação hipotética, temos uma tabela de pedidos e uma tabela de clientes e queremos pegar um número de pedido dele, para isso usamos a seguinte query:
select id_pedido
into vID_Pedido
from pedido p, cliente c
where c.nome = 'MEISON'
and c.id_cliente = p.id_cliente;

Se o cliente tiver feito somente um pedido, essa query retornará só uma linha, mas se ele já for um cliente que está pedindo pela segunda ou mais vez será retornado mais de uma linha o que retornará o erro em questão, pois tentará jogar para a variavel vID_Pedido mais de um valor, o que não é possível. Para corrigir se a regra permitir é só pegar uma linha, por exemplo o ultimo pedido, ficando dessa forma:
select id_pedido
into vID_Pedido
from pedido p, cliente c
where c.nome = 'MEISON'
and c.id_cliente = p.id_cliente
and rownum=1
order by id_pedido desc;

O rownum=1 restringe a só uma linha, mas lembrando que sem o order by, ele pega a primeira linha que trouxer do banco. O order by irá garantir que seja a ultima linha criada.
2 – Query pode retornar mais de um registro
Tendo como base o primeiro exemplo, porém precisando pegar todos os pedidos desse cliente, o que deve ser feito é tratar cada um deles individualmente, eu utilizaria o loop, ficando assim:
for vAux in (select id_pedido from pedido where id_cliente = 1)
loop
--Procedimento para tratar vAux.id_pedido
end loop;

Dessa forma não é dado o erro ORA-01422 e trata-se da maneira certa cada um dos pedidos.
3 – Query não deve retornar mais de uma linha, erro de cadastro
Isso é causado quando o sistema deveria inserir somente uma linha e por algum erro, inseriu mais de uma, provocando um erro conceitual. É claro que nesse caso deve-se corrigir a origem que é a inserção erronea de mais de uma linha, mas pode-se tratar também no destino, vamos utilizar a mesma query, ela deveria tratar os erros e ficaria dessa forma:
begin
select id_pedido
into vID_pedido
from pedido
where id_cliente = 1;
exception
when too_many_rows then
raise_application_error(-20000,'Erro na tabela pedido, mais linhas para o cliente do que permitido.');
end;

Dessa forma abordamos alguns cenários que podemos sanar esse problema. Caso você tenha algum outro problema, comente poderemos fazer outro artigo para solucionar seu problema.

fonte: http://www.meison.com.br/2010/02/19/como-resolver-o-erro-ora-01422/

COMANDOS DBCC DO SQL SERVER 2000

O SQL SERVER 2000 possui um conjunto de comandos DBCC
(DATABASE CONSOLE COMMAND), usados na administração do
banco de dados.

De acordo com sua funcionalidades, são agrupados em 4 categorias:
MANUTENÇÃO - comandos que realizam tarefas de manutenção em:
  • databases
  • índices
  • grupos de arquivos
 DBCC DBREINDEX
 DBCC DBREPAIR --> MANTIDO POR COMPATIBILIDADE (DEVE-SE DROPAR E RECRIAR O DATABASE CORROMPIDO)
 DBCC INDEXDEFRAG
 DBCC SHRINKDATABASE
 DBCC SHRINKFILE
 DBCC UPDATEUSAGE

STATUS - comandos que checam o status de objetos do sistema:
 DBCC INPUTBUFFER
 DBCC OPENTRAN
 DBCC OUTPUTBUFFER
 DBCC PROCCACHE
 DBCC SHOWCONTIG
 DBCC SHOW_STATISTICS
 DBCC SQLPERF
 DBCC TRACESTATUS
 DBCC USEROPTIONS
VALIDAÇÃO - comandos que validam a estrutura e/ou alocação de:
  • databases
  • tabelas
  • índices
  • catálogos
  • grupos de arquivos
  • tabelas de sistema
  • páginas do database
 DBCC CHECKALLOC
 DBCC CHECKCATALOG
 DBCC CHECKCONSTRAINTS
 DBCC CHECKDB
 DBCC CHECKFILEGROUP
 DBCC CHECKIDENT
 DBCC CHECKTABLE
 DBCC NEWALLOC
DIVERSOS - comandos que realizam tarefas não enquadrados nas categorias acima:
 DBCC dllname (FREE)
 DBCC HELP
 DBCC PINTABLE
 DBCC ROWLOCK
 DBCC TRACEOFF
 DBCC TRACEON
 DBCC UNPINTABLE
******************************************************************
ABAIXO, APRESENTAREI OS COMANDOS, SEGUIDOS DE EXEMPLOS DE USO.

LEMBRO QUE NÃO ESTOU LHES MOSTRANDO A SINTAXE COMPLETA DO COMANDO, MAS AS SUAS FORMAS MAIS USADAS.
PARA MAIS DETALHES, CONSULTE OS BOOKS ON LINE DO SQL SERVER OU O SITE HTTP://MSDN.MICROSOFT.COM/SQL
******************************************************************

Listagem 01 - Exemplos dos comandos
USE PUBS
--TODOS OS EXEMPLOS ABAIXO SERÃO EXECUTADOS NESSE DATABASE


/*
 DBCC DBREINDEX(NOME DA TABELA) WITH NO_INFOMSGS

 RECRIA TODOS OS ÍNDICES DA TABELA PASSADA COMO PARÂMETRO

 ONDE:
  NOME DA TABELA:
   É O NOME DA TABELA A REINDEXAR
  WITH NO_INFOMSGS:
   INDICA QUE NÃO DEVEM SER APRESENTADAS AS MENSAGENS
*/

DBCC DBREINDEX(AUTHORS)
--DBCC execution completed. If DBCC printed error messages, contact your system administrator.

DBCC DBREINDEX(AUTHORS) WITH NO_INFOMSGS
--The command(s) completed successfully.
EXEC SP_MSFOREACHTABLE
 @COMMAND1 = PRINT REINDEXANDO A TABELA ?,
 @COMMAND2 = DBCC DBREINDEX(?) WITH NO_INFOMSGS
/*
REINDEXANDO A TABELA [dbo].[titleauthor]
REINDEXANDO A TABELA [dbo].[stores]
REINDEXANDO A TABELA [dbo].[sales]
REINDEXANDO A TABELA [dbo].[roysched]
REINDEXANDO A TABELA [dbo].[discounts]
REINDEXANDO A TABELA [dbo].[jobs]
REINDEXANDO A TABELA [dbo].[pub_info]
REINDEXANDO A TABELA [dbo].[employee]
REINDEXANDO A TABELA [dbo].[authors]
REINDEXANDO A TABELA [dbo].[publishers]
REINDEXANDO A TABELA [dbo].[titles]
*/



/*
 DBCC INDEXDEFRAG(DATABASE, TABELA, ÍNDICE) WITH NO_INFOMSGS

 REORGANIZA O ÍNDICE DA TABELA PASSADA COMO PARÂMETRO
 ONDE:
  DATABASE:
   É O NOME DO DATABASE QUE CONTÉM A TABELA
  TABELA:
   É O NOME DA TABELA QUE CONTÉM O ÍNDICE
  ÍNDICE:
   É O NÚMERO QUE INDICA A ORDEM DO ÍNDICE
  WITH NO_INFOMSGS:
   INDICA QUE NÃO DEVEM SER APRESENTADAS AS MENSAGENS
*/

DBCC INDEXDEFRAG(PUBS, EMPLOYEE, 1)
/*
Pages Scanned Pages Moved Pages Removed
------------- ----------- -------------
0             0           0

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/

DBCC INDEXDEFRAG(PUBS, EMPLOYEE, 1) WITH NO_INFOMSGS
--The command(s) completed successfully.


/*
 DBCC SHRINKDATABASE(DATABASE, ESPAÇO_LIVRE) WITH NO_INFOMSGS

 DESALOCA ESPAÇOS NÃO OCUPADOS PELO DATABASE
 ONDE:
  DATABASE:
   É O NOME DO DATABASE
  ESPAÇO_LIVRE:
   É O ESPAÇO LIVRE EM % QUE DEVERÁ ESTAR ALOCADO
   NO FIM DO PROCESSO
*/

DBCC SHRINKDATABASE(PUBS, 0)
/*
DbId   FileId CurrentSize MinimumSize UsedPages   EstimatedPages
------ ------ ----------- ----------- ----------- --------------
5      1      160         80          152         152
5      2      63          63          56          56

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/

DBCC SHRINKDATABASE(PUBS, 0) WITH NO_INFOMSGS
--The command(s) completed successfully.

EXEC SP_MSFOREACHDB
 @COMMAND1 = PRINT FAZENDO SHRINK DO DATABASE ?,
 @COMMAND2 = DBCC SHRINKDATABASE(?, 0) WITH NO_INFOMSGS
/*
FAZENDO SHRINK DO DATABASE CAP_03
FAZENDO SHRINK DO DATABASE CAP_04
FAZENDO SHRINK DO DATABASE CAP_05
FAZENDO SHRINK DO DATABASE CAP_06
FAZENDO SHRINK DO DATABASE CAP_07
FAZENDO SHRINK DO DATABASE CAP_08_09
FAZENDO SHRINK DO DATABASE correio
FAZENDO SHRINK DO DATABASE DB_CDS
FAZENDO SHRINK DO DATABASE DVD
FAZENDO SHRINK DO DATABASE FILMES
FAZENDO SHRINK DO DATABASE IMPACTA
FAZENDO SHRINK DO DATABASE master
FAZENDO SHRINK DO DATABASE model
FAZENDO SHRINK DO DATABASE msdb
FAZENDO SHRINK DO DATABASE Northwind
FAZENDO SHRINK DO DATABASE pubs
FAZENDO SHRINK DO DATABASE tempdb
*/


/*
 DBCC SHRINKFILE(NOME_LÓGICO, ESPAÇO_LIVRE) WITH NO_INFOMSGS

 DESALOCA ESPAÇOS NÃO OCUPADOS POR UM ARQUIVO DE DADOS OU LOG
 ONDE:
  NOME_LÓGICO:
   É O NOME LÓGICO DO ARQUIVO
  ESPAÇO_LIVRE:
   É O ESPAÇO LIVRE EM % QUE DEVERÁ ESTAR ALOCADO
   NO FIM DO PROCESSO
*/

EXEC SP_HELPDB PUBS
/*
MÚLTIPLAS LINHAS COM INFORMAÇÕES SOBRE O DATABASE PUBS
*/

DBCC SHRINKFILE(PUBS, 0)
/*
DbId   FileId CurrentSize MinimumSize UsedPages   EstimatedPages
------ ------ ----------- ----------- ----------- --------------
5      1      160         80          152         152

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/


/*
 DBCC UPDATEUSAGE(DATABASE, TABELA, ÍNDICE) WITH COUNT_ROWS, NO_INFOMSGS

 APRESENTA E CORRIGE OS VALORES ARMAZENADOS INCORRETAMENTE NA TABELA
 SYSINDEXES, QUE FAZEM COM QUE A SAÍDA DA PROCEDURE SP_SPACEUSED SEJA FALSA

 ONDE:
  DATABASE:
   É O NOME DO DATABASE QUE CONTÉM A TABELA - SE FOR
   DIGITADO O VALOR 0 (ZERO), O DATABASE USADO SERÁ O
   QUE ESTÁ EM USO
  TABELA:
   É O NOME DA TABELA QUE CONTÉM O ÍNDICE - OPCIONAL
  ÍNDICE:
   É O NÚMERO QUE INDICA A ORDEM DO ÍNDICE - OPCIONAL
  WITH NO_INFOMSGS:
   INDICA QUE NÃO DEVEM SER APRESENTADAS AS MENSAGENS
  WITH COUNT_ROWS:
   ATUALIZA A COLUNA "ROWS" DA TABELA SYSINDEXES COM A
   QUANTIDADE DE LINHAS DA TABELA QUE ESTÁ SENDO ANALISADA,
   PARA OS ÍNDICES DE ID 0 E 1
*/

EXEC SP_SPACEUSED EMPLOYEE
/*
name       rows  reserved  data   index_size  unused 
---------- ----- --------- ------ ----------- -------
employee   43    152 KB    64 KB  32 KB       56 KB
*/

DBCC UPDATEUSAGE (PUBS, EMPLOYEE) WITH COUNT_ROWS
/*
DBCC UPDATEUSAGE: sysindexes row updated for table employee (index ID 1):
        DATA pages: Changed from (8) to (1) pages.
        USED pages: Changed from (12) to (5) pages.
        RSVD pages: Changed from (19) to (5) pages.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/

EXEC SP_SPACEUSED EMPLOYEE
/*
name      rows  reserved  data  index_size  unused 
--------- ----- --------- ----- ----------- -------
employee  43    40 KB     8 KB  32 KB       0 KB
*/


/*
 DBCC INPUTBUFFER(PROCESSO)

 RETORNA O ÚLTIMO COMANDO ENVIADO PELO CLIENTE AO SQL SERVER
 ONDE:
  PROCESSO:
   ID DO PROCESSO
*/

SELECT @@SPID
--51

DBCC INPUTBUFFER(51)
/*
EventType      Parameters EventInfo             
-------------- ---------- ----------------------
Language Event 0          DBCC INPUTBUFFER(51)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/

--AGORA, ABRA UMA NOVA JANELA (CTRL+N) E EXECUTE O COMANDO ABAIXO:
SELECT @@SPID
--52

SELECT * FROM SYSOBJECTS
--DIVERSAS LINHAS DE TABELA

--VOLTE A ESSA JANELA, SEM FECHAR A OUTRA (CTRL+TAB) E EXECUTE O COMANDO ABAIXO:
DBCC INPUTBUFFER(52)
/*
EventType      Parameters EventInfo                 
-------------- ---------- --------------------------
Language Event 0          SELECT * FROM SYSOBJECTS

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/


/*
 DBCC OPENTRAN(DATABASE) WITH TABLERESULTS

 RETORNA DETALHES DAS TRANSAÇÕES ABERTAS
 ONDE:
  DATABASE:
   É O NOME DO DATABASE - SE FOR DIGITADO O VALOR 0
   (ZERO), O DATABASE USADO SERÁ O QUE ESTÁ EM USO
  WITH TABLERESULTS:
   RETORNA EM FORMATO DE TABELA
*/

--ABRA UMA NOVA JANELA (CTRL+N) E EXECUTE OS COMANDOS ABAIXO:
BEGIN TRAN
SELECT *
FROM TITLES A,
 TITLES B,
 TITLES C,
 TITLES D,
 TITLES E,
 TITLES F
--ESSE SELECT RETORNA 34,012,224 REGISTROS
--(A TABELA TITLES TEM 18 REGISTROS)

--AGORA, ANTES DE O COMANDO TERMINAR, (PAREI A EXECUÇÃO AOS 10 MINUTOS E AINDA TINHA GERADO APENAS 12,500,000 REGISTROS)VOLTE PARA ESSA JANELA (CTRL+TAB) E EXECUTE O COMANDO ABAIXO:

DBCC OPENTRAN(0)
/*
Transaction information for database pubs.

Oldest active transaction:
    SPID (server process ID) : 55
    UID (user ID) : 1
    Name          : user_transaction
    LSN           : (4:365:1)
    Start time    : Jul 30 2006  4:35:14:633PM
*/

DBCC OPENTRAN(0) WITH TABLERESULTS
/*
pubs              OPENTRAN                   
----------------- ---------------------------
OLDACT_SPID       55
OLDACT_UID        1
OLDACT_NAME       user_transaction
OLDACT_LSN        (4:365:1)
OLDACT_STARTTIME  Jul 30 2006  4:35:14:633PM
*/

--FINALMENTE, CANCELE A EXECUÇÃO DO SELECT NA OUTRA JANELA

/*
 DBCC OUTPUTBUFFER(PROCESSO)

 RETORNA EM HEXA E ASCII A RESPOSTA DO SERVIDOR À SOLICITAÇÃO
 DO CLIENTE

 ONDE:
  PROCESSO:
   ID DO PROCESSO
*/

--ABRA UMA NOVA JANELA (CTRL+N) E EXECUTE OS COMANDOS ABAIXO:
SELECT @@SPID
--53

SELECT GETDATE()
--2006-07-30 17:01:36.800

--AGORA, VOLTE PARA ESSA JANELA (CTRL+TAB) E EXECUTE O COMANDO ABAIXO:
DBCC OUTPUTBUFFER(53)
/*
Output Buffer                                                                
---------------------------------------------------------
00000000   04 01 00 ... 00 00 00 00 a7   ...+.5.........§
00000010   07 00 09 ... 41 47 4e 41 4c   .. .Ð.4.Ñ..AGNAL
00000020   44 4f fd ... 00 fd 01 00 ba   DOý..Á......ý..º

... saída dos endereços -> 00000020 A 00000fc0
00000fd0   00 70 17 ... 1a 8a 01 00 00   .p..@...€s..Š...
00000fe0   ff ff ff ... 00 00 00 00 00   ÿÿÿÿ¹...........
00000ff0   00 00 00 ... 00 00 00 01 00   ................
*/




fonte: http://www.devmedia.com.br/articles/viewcomp.asp?comp=2481

Exemplo - Oracle - Coluna Acumulado

SQL> SELECT
  2    B.SAL
  3  , SUM(A.SAL) ACUMULADO
  4  FROM
  5    EMP A
  6  , EMP B
  7  WHERE A.ROWID <= B.ROWID
  8  GROUP BY B.ROWID, B.SAL
  9  /

       SAL  ACUMULADO
---------- ----------
       800        800
      1600       2400
      1250       3650
      2975       6625
      1250       7875
      2850      10725
      2450      13175
      3000      16175
      5000      21175
      1500      22675
      1100      23775
       950      24725
      3000      27725
      1300      29025
                29025

15 rows selected.

SQL> 


fonte: http://glufke.net/oracle/viewtopic.php?t=530

Removendo senhas de rede salvas

Aplicação: Windows XP, Vista, Seven e 2003 Sever.
Quando você acessa um compartilhamento remoto (\\server\arquivos) e é salvo uma senha para esse acesso pode-se remover esse senhas e outras com o script abaixo.
Ir em Iniciar> Executar digite cmd para abrir o ms-dos.

Digitar no ms-dos rundll32.exe keymgr.dll, KRShowKeyMgr tudo de uma vez inclusive a vírgula.


Irá abrir essa janela onde você pode remover senhas salvar de compartilhamentos, msn, conexão remotas e outras.

 Nota: Senhas salvas de sites não são removidas com esse procedimento, apenas senhas de rede e Windows Messenger.

Fonte: http://hrapytor.webnode.com.br/news/removendo-senhas-salvas-/

quarta-feira, 7 de dezembro de 2011

Excel – Protegendo planilhas de maneira eficiente


Introdução

O Microsoft Excel permite diversas formas de proteção de dados, incluindo ocultar planilhas e fórmulas a fim de proteger a inteligência, a lógica, da sua planilha.
É importante proteger, conservar a inteligência/lógica de nossas fórmulas, seja por proteção da propriedade intelectual ou por qualquer outro motivo. Alguns recursos são bastante conhecidos. Citarei aqui todas as formas que conheço e que creio serem suficientes para proteger nossas planilhas.

Ocultando planilhas

O método mais básico de proteger planilhas é ocultando-as através do comando: Formatar -> Planilha -> Ocultar, conforme indicado na figura a seguir:

O Excel ocultará a planilha que estiver ativa naquele momento, conforme indicado na figura a seguir:

Esta é uma maneira simples de ocultar as planilhas. Para voltar a exibira as planilhas ocultas, basta usar o comando: Formatar -> Planilha -> Reexibir, conforme indicado na figura a seguir:

Ao executar o comando Formatar -> Planilha -> Reexibir , será aberta a janela Reexibir, na qual são listadas as planilhas ocultas, conforme indicado na figura a seguir. Na listagem estão todas as planilhas ocultas, as quais poderão ser reexibidas.

Por exemplo, para reexibir a planilha Plan1, basta clicar na planilha, para seleciona-la e clicar em OK. Com isso a planilha “Plan1” voltará a ser exibida.
Protegendo e ocultando células
Podemos contornar este problema protegendo a planilha pelo modo clássico. Acionando o comando: Ferramentas -> Proteger -> Proteger planilha, teremos acesso a diferente níveis de proteção à planilha conforme mostra as duas figuras a seguir:


Dentre as opções disponíveis, as mais interessantes são:
Selecionar células bloqueadas à Desmarcando esta opção, o usuário só poderá navegar nas células que tiverem nas suas propriedades, a opção Travada desmarcada (Veja esta opção em Formatar -> Células, guia Proteção).
Selecionar células desbloqueadas à Desmarcando esta opção, o usuário não conseguirá navegar pela planilha.
Todas as outras opções trabalham nesse mesmo padrão. Deixando a caixa de seleção desmarcada, a opção corrente não será liberada ao usuário. Dessa forma você pode conduzir o usuário na utilização da planilha. Outro recurso interessante, é que marcando a opção Oculta na caixa de formatação de células, seu conteúdo (fórmulas) não serão visíveis para o usuário, mesmo que este possa navegar pela célula, conforme ilustrado pela seqüência de figuras a seguir:


Protegendo a planilha conforme citado anteriormente, o conteúdo da fórmula não estará visível na barra de fórmulas:

Outra opção bastante utilizada, porém sem muita proteção é a de ocultar as guias de planilhas no menu Ferramentas -> Opções, guia Exibir, desmarcando a opção Guias de planilha, conforme destacado na figura a seguir:

Dessa forma, planilhas exibidas ou ocultas não estarão visíveis conforme segue:

Até aí tudo bem. Mas não precisamos ser muito veteranos no Excel a ponto de saber alguns atalhos básico como Ctrl+C para copiar, Ctrl+V para colar ou até mesmo Ctrl+1 para abrir a caixa de formatação de células. Por isso, sabemos que existe um atalho também para navegação de planilhas, que é o Ctrl+PageDown para ir para a planilha à direita da planilha atual e Ctrl+PageUp para a esquerda. Ocultar as guias de planilha não impede o usuário de navegar pelas planilhas. Faça o teste e comprove. Abra uma nova pasta, oculta as guias de planilha e tente navegar com os atalhos citados acima.
Algumas combinações desses recursos podem resultar em resultados mais eficientes, porém, existe uma maneira de fazê-lo de forma simples e segura (ou quase).
Ocultando definitivamente as planilhas
As planilhas tem 3 modos de exibição, dois muito conhecidos e 1 mais restrito a usuários avançados, mas que detalharei de forma que possa ser acessível a qualquer nível de usuário.
  • Visível
  • Oculta
  • Muito oculta <- é neste que devemos dar atenção.
Nota: A tradução do recurso (Muito oculta) é por minha conta e risco.
Para acessar este último nível de visibilidade da planilha, teremos que ir ao Editor do Visual Basic disponível no Excel.
Atenção! Dependendo do processo de instalação do Office, o Visual Basic pode não estar disponível em seu Microsoft Excel.
Para acessar o Editor do Visual Basic, vá em Ferramentas, Macro, Editor do Visual Basic, ou simplesmente no Excel, tecle Alt+F11. A janela a seguir será exibida:

Nota: Caso não consiga ver os painéis visíveis à esquerda da tela, acione-os no menu Exibir, Project Explorer (VBA Project) e Janela de propriedades. No Project Explorer, podemos ver todos os objetos de nossa pasta de trabalho hierarquizados. O primeiro é a própria pasta de trabalho, seguida de todas as planilhas identificadas pelo seu respectivo nome.
Selecionando uma das planilhas, suas propriedades serão exibidas na janela de propriedades conforme indicado na figura a seguir:
Obs : as janelas foram re-dispostas na tela para facilitar a visualização.
Detalhar todas as propriedades das planilhas é assunto para outro tutorial. Neste caso, nos atentaremos para a propriedade Visible:

Vou detalhar as opções disponíveis:
Visível -> -1 – xlSheetVisible
Oculta -> 0 – xlSheetHidden
Muito oculta -> 2 – xlSheetVeryHidden
As duas primeiras já são conhecidas e podem ser acessadas pelo Excel como mostrado anteriormente. A propriedade Visible setada para “-1 – xlSheetVisible” é a planilha visível normalmente.
Setada para “0 – xlSheetHidden” , deixa planilha oculta, mas podendo ser exibida através do menu Formatar, planilha, Reexibir.
Já a última opção, coloca a planilha em modo oculto, de forma que nem mesmo através da opção Reexibir , poderá ser acessada! Faça o teste. Coloque a planilha Plan1 com a propriedade Visible setada para “2 – xlSheetVeryHidden”:

Retorne ao Excel, bastando fechar o Visual Basic ou clicando no botão Exibir Microsoft Excel:

Você verá que a planilha Plan1 está oculta como esperávamos. Agora tente ir ao menu Formatar -> Planilha, a opção Reexibir estará desabilitada (conforme indicado na próxima figura). Mesmo que você oculte manualmente a planilha Plan2 ou Plan3 e acionar o menu Reexibir, a planilha Plan1 não aparecerá! Porém, ela continua existindo e pode conter valores referenciados por fórmulas nas outras planilhas. Faça o teste e comprove.

Você pode estar se perguntando: Mas o que eu faço, alguém pode desfazer? A resposta é sim. Mas o nosso trabalho é dificultar ao máximo o trabalho de quem quer fazê-lo, já que não existe sistema 100% seguro, nem mesmo nos poderosos e sofisticados laboratórios na NASA.
A solução é proteger seu projeto VBA. Na mesma tela em que você alterou as configurações da planilha, vá até o Project Explorer e clique com o botão direito no título do Projeto e seleciona Propriedade do VBA Project:


Nesta tela, selecione a opção bloquear projeto para exibição e coloque uma senha para proteção do projeto. Salve e fecha a planilha. Abra-a novamente e vá ao Editor do Visual Basic (Alt+F11). Você verá que o Project Explorer será exibido da seguinte forma:

Se alguém tentar expandir o nó do projeto, verá a seguinte mensagem:

Pronto! Sua planilha está protegida! (desde que você não tenha definido uma senha que seja facilmente descoberta por programas de quebra de senhas. Uma boa senha deve ter letras, números e caracteres especiais. Se tiver somente letras e números, os programas de quebra de senha, como o Passware Kit, irão descobrir a senha em menos de um minuto).
É claro que esta não é uma proteção infalível, até mesmo porque nós mesmos temos o péssimo costume de não anotar senhas e acabamos virando nossa defesa contra nós mesmos. Programas para quebrar senhas como o Advanced Office 2000 Password Recovery podem recuperar a senha de projetos VBA ou sobreescrevê-las para que possam ser acessados.
Meu conselho para este tipo de ferramenta é você adotar uma metodologia segura de definição de senhas, por exemplo, não colocar informações pessoais, não colocar senhas do tipo “1234”. Sempre procure colocar senhas que não se relacionem em nada com você e que contenham letras e números intercalados e, o mais importante, sempre tenha senhas com mais de 6 ou 7 dígitos.
Creio que seguindo estas metodologias, é possível ter um nível de segurança razoável em nossos trabalhos com o Microsoft Excel.

Fonte: http://www.tomasvasquez.com.br/blog/microsoft-office/excel-protegendo-planilhas-de-maneira-eficiente
Related Posts Plugin for WordPress, Blogger...