terça-feira, 25 de novembro de 2014

Problema ao restaurar backup do SQL Server 2000 para o 2012 [SQL Server];

Senhores, Boa tarde !

Se caso já tentou alguma vez restaurar backup do SQL Server 2000 para o 2012, com certeza retornou o seguinte erro:

-----------------------------------------------------------------------------------------------

 Msg 3169, Level 16, State 1, Line 2

The database was backed up on a server running version 8.00.0818. That version is incompatible with this server, which is running version 11.00.3000. Either restore the database on a server that supports the backup, or use a backup that is compatible with this server.

Msg 3013, Level 16, State 1, Line 2

RESTORE DATABASE is terminating abnormally.

-----------------------------------------------------------------------------------------------

No SQL Server 2012, só é possível restaurar backups feitos da versão 2005 ou superior.

Para a solução, será necessário restaurar o backup do SQL Server 2000 em alguma outra instância SQL Server 2005 ou 2008.

No SQL Server 2005 ou 2008:

Defina o nível de compatibilidade (compatibility level) para SQL Server 2005 (90) ou SQL Server 2008 (100) e restaure o Backup.



Após finalizado, efetue o backup do banco de dados que foi feita a importação, e restaure o arquivo .BAK gerado no SQL Server 2012.

Bruno Duarte.

sexta-feira, 14 de novembro de 2014

Tabela READ ONLY - Funcionalidade do Oracle 11g [Oracle];

Senhores, Bom dia!

Uma das novas funcionalidades que chegou com o Oracle 11g foi a possibilidade de alterar uma tabela somente para leitura. Vou explicar um pouco melhor...

Quando criamos um usuário e queremos que ele tenha apenas a permissão de SELECT em uma tabela, concedemos o GRANT de SELECT a ele, mas e se você também quisesse que ninguém tivesse acesso a esta específica tabela? e até mesmo o proprietário (OWNER), SYS e SYSTEM.

Bom.. agora isto é possível com a funcionalidade READ ONLY - Garante que apenas o SELECT seja executado e para os outros comandos DML e Truncate (DDL), não são permitidos.

Bom...vamos ao exemplo.

ALTER TABLE TABELA READ ONLY;


E para permitir novamente os acessos a Tabela, utilizamos:

ALTER TABLE TABELA READ WRITE;

Parceria - Antonio Nilson: LinkedIn

Abs,
Bruno Duarte.

sexta-feira, 10 de outubro de 2014

Order BY em campo Varchar2 [Oracle];

Senhores, Boa tarde.

Aqui vai uma dica para o tipo de ordenação do comando ORDER BY.
Se ainda não ficou claro do que eu estou falando, vamos imaginar um campo Varchar2, contendo String, números e etc.

No ORDER BY, Como que iriam vir ordenados ?


















No meu caso retornou primeiro String e depois os números, isto ocorre pelo o valor que está definido do parâmetro NLS_SORT.

select * from nls_session_parameters;
















Se caso precisar que os caracteres numéricos apareçam antes dos caracteres alfabéticos, podemos fazer isso de 2 jeitos - Alterando a Sessão ou por uma Função própria do Oracle.

1- Alterando a Sessão
ALTER SESSION SET NLS_SORT='BINARY';

2-Pela Função NLSSORT
Ex: select nome from produto order by NLSSORT(nome,'NLS_SORT=BINARY');
















Se for necessário que seja ordenado de alguma outra maneira, nesta tabela mostra como seria ordenado se o NLS_SORT fosse definido para WEST_EUROPEAN, BINARY, BINARY_CI e BINARY_AI.














Abs!
Bruno Duarte.

quinta-feira, 18 de setembro de 2014

Commit a cada bloco de Insert - Otimizado [Oracle];

Senhores, Boa tarde!

Conforme falado no Post anterior, o desempenho da codificação do FORALL é extremamente rápido.

Precisei migrar uma tabela com alguns milhões de registros, assim foi necessário efetuar um INSERT parcial.
No exemplo, a cada 500 Mil de INSERTS será feito um commit:

DECLARE
   
   C_limit PLS_INTEGER := 500000;

   TYPE TCOLUNA1 IS TABLE OF TABELA.COLUNA1%TYPE;
   TYPE TCOLUNA2 IS TABLE OF TABELA.COLUNA2%TYPE;
   TYPE TCOLUNA3 IS TABLE OF TABELA.COLUNA3%TYPE;
   TYPE TCOLUNA4 IS TABLE OF TABELA.COLUNA4%TYPE;
   TYPE TCOLUNA5 IS TABLE OF TABELA.COLUNA5%TYPE;
   TYPE TCOLUNA6 IS TABLE OF TABELA.COLUNA6%TYPE;
   TYPE TCOLUNA7 IS TABLE OF TABELA.COLUNA7%TYPE;
   TYPE TCOLUNA8 IS TABLE OF TABELA.COLUNA8%TYPE;
   TYPE TCOLUNA9 IS TABLE OF TABELA.COLUNA9%TYPE;
     
   V_COLUNA1 TCOLUNA1;
   V_COLUNA2 TCOLUNA2;
   V_COLUNA3 TCOLUNA3;
   V_COLUNA4 TCOLUNA4;
   V_COLUNA5 TCOLUNA5;
   V_COLUNA6 TCOLUNA6;
   V_COLUNA7 TCOLUNA7;
   V_COLUNA8 TCOLUNA8;
   V_COLUNA9 TCOLUNA9;

   CURSOR CUR IS
   SELECT COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9
   FROM TABELA;

BEGIN

 OPEN CUR;
   
   LOOP
      FETCH CUR
      BULK COLLECT INTO V_COLUNA1,V_COLUNA2,V_COLUNA3,V_COLUNA4,V_COLUNA5,V_COLUNA6,V_COLUNA7,V_COLUNA8,V_COLUNA9
      LIMIT c_limit;


      FORALL i in 1..V_COLUNA1.count
  
        INSERT INTO NOVA_TABELA
        (COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9)
        VALUES
        (V_COLUNA1(i),V_COLUNA2(i),V_COLUNA3(i),V_COLUNA4(i),V_COLUNA5(i),V_COLUNA6(i),V_COLUNA7(i),V_COLUNA8(i),V_COLUNA9(i));
      
      EXIT WHEN V_COLUNA1.COUNT = 0;
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas INSERIDAS');  
      COMMIT;
  
    END LOOP;
 CLOSE CUR;  
END;
Valeu,
Bruno Duarte.