Microsoft SQL Server Migration Assistant™ para Oracle Facilitando a Migração de Bancos de Dados Publicado: Março de 2005 Para as informações mais recentes, consulte http://www.microsoft.com/brasil/sql/solutions/ssm/default.mspx. Índice Introdução ...................................................................................................................................1 Fase de Avaliação ..................................................................................................................1 Conversão de Esquemas .......................................................................................................3 Migração de Dados.................................................................................................................5 Conversão da Lógica de Negócio...........................................................................................5 Validação, Integração e Análise de Desempenho ................................................................12 Conclusão .................................................................................................................................13 Introdução O SQL Server é o principal sistema de gerenciamento de bancos de dados relacional no mercado hoje. Segundo recentes relatórios do IDC (consulte http://news.com.com/Database+sales+show+some+life/2100-1012_3-5602603.html), O SQL Server é o banco de dados que cresce mais rapidamente no mercado. Os clientes estão adotando o SQL Server por causa de seu baixo custo total de propriedade, facilidade de gerenciamento, segurança robusta e escalabilidade de classe empresarial. Contudo, muitos clientes continuam executando seus aplicativos com outros bancos de dados tais como Oracle e DB2. Isto se deve principalmente pelo custo e complexidade de migração desses bancos de dados para o SQL Server. Para tratar dessa situação, a Microsoft está oferecendo um novo produto para facilitar a migração para o SQL Server. O Microsoft SQL Server Migration Assistant (SSMA Assistente de Migração do Microsoft SQL Server) automatiza o processo de migração a partir de outros bancos de dados para o SQL Server. Este documento explicará cada passo do processo de migração de bancos de dados e discutirá como o SSMA significativamente acelera, e reduz os custos de cada um dos passos. O lançamento inicial do SSMA dedica-se à migração do Oracle para o Oracle to Microsoft SQL Server 2000. O SQL Server Migration Assistant consiste nos seguintes componentes principais: Migration Analyzer — avalia a complexidade do projeto de migração. Schema & Data Migrator and SQL Converter — realiza a conversão do banco de dados e proporciona uma poderosa interface para desenvolvedores de bancos de dados de plataformas cruzadas. Migration Tester — oferece validação automatizada do processo de migração. Migrar sua aplicação a partir de um outro sistema de banco de dados para o SQL Server inclui as seguintes fases. Fase de Avaliação Conversão de Esquema Migração dos Dados Conversão da lógica de negócio Validação, integração e análise de desempenho. As seções a seguir cobrem cada um desses passos usando o Assistente de Migração do SQL Server para mostrar como a migração é realizada. Fase de Avaliação Quando TI determina que seria benéfico migrar um número de bancos de dados de Oracle para SQL Server; o primeiro passo é avaliar a dificuldade, tempo e custo da migração. Fatores que contribuem diretamente para isso são a “complexidade” dos bancos de dados e das aplicações que os usam. Embora não haja uma medida formal para complexidade de bancos de dados, seria cada vez mais complexo e custoso migrar quanto mais objetos de lógica de negócio (procedimentos armazenados, funções, triggers, pacotes e assim por diante) que ele contém. Aumentando a complexidade da migração estão as diferenças de funções de sistema entre as duas plataformas. Funções fornecidas por uma plataforma podem não ser oferecidas pela outra, ou pode haver diferenças sintáticas ou semânticas na implementação de funções comuns. Microsoft SQL Server Migration Assistant 1 A complexidade da migração das aplicações para o novo banco de dados também precisa ser avaliada. O número de solicitações de SQL feitas pela aplicação contribui para essa complexidade, porque todas elas devem ser convertidas. Ainda mais importante, o grau no qual SQL dinâmico é usado aumenta significativamente a complexidade da conversão, porque pode ser necessário reescrever um grande código para se converter as consultas de SQL dinâmica. O resultado da avaliação da migração é uma estimativa da quantidade de esforço necessário para a conclusão de cada passo do processo de migração, e a despesa total do projeto. Deve-se notar que conduzir a avaliação da migração pode, ela própria, ser um esforço dispendioso em tempo e dinheiro. Não é incomum que uma avaliação leve vários meses para um grande projeto de migração e custe dezenas de milhares de dólares. Felizmente, existe uma nova ferramenta de avaliação de migração, o SSMA Migration Analyzer, que realiza uma análise profunda para obter estimativas do tempo e esforço necessários para a migração de um banco de dados. Tipicamente, uma avaliação levará menos de um dia para se completar. A ferramenta oferece uma estimativa do trabalho necessário para migrar o banco de dados manualmente, assim como a porcentagem do banco de dados que pode ser convertida automaticamente. O Migration Analyzer computa aproximadamente 100 estatísticas específicas que caracterizam o banco de dados de maneira abrangente. O SQL Converter converte tipicamente mais de 90 por cento do código SQL, automaticamente, e já realizou até 99 por cento de conversão automática do código. Além do perfil abrangente do banco de dados em Oracle, o relatório da avaliação indica os objetos do banco de dados que o SQL Converter não pode converter, com as construções específicas no código que provocam o problema. A seguir estão algumas das estatísticas computadas pelo Migration Analyzer sobre todos os objetos do banco de dados no banco de dados de origem em Oracle. Elas incluem: Número total de objetos de banco de dados tais como procedimentos, funções, triggers, tabelas, índices, pacotes, seqüências e visualizações. Número total de linhas de código, inclusive estatísticas por objeto. Número total de instruções SELECT, INSERT, DELETE, e UPDATE. Número total de CURSORs , RECORDs, e EXCEPTIONs. Número total e porcentagem dos componentes automaticamente conversíveis. Complexidade estimada da conversão. Duração estimada da migração do projeto em termos de horas de trabalho manual (considerando-se a NÃO utilização do SSMA). As estatísticas fornecidas pelo Migration Analyzer podem ser salvas em um arquivo externo em formato compatível com Excel para possibilitar ao usuário o trabalho com esses dados offline se preferir. Microsoft SQL Server Migration Assistant 2 A tomada de tela a seguir mostra como o Migration Analyzer apresenta essas estatísticas ao usuário: Conversão de Esquemas Mapeamento de esquemas e objetos O esquema é a base para definir o banco de dados de destino. Na migração a partir do Oracle para o SQL Server, o novo esquema pode ser derivado de uma maneira bastante direta a partir do esquema original. Em virtude de diferenças de recursos entre as duas plataformas, o mapeamento entre os esquemas não pode ser de um para um. Um exemplo de onde isso se manifesta é em lidar-se com atributos de como BLOBs. O Oracle suporta múltiplos atributos com valores de BLOB por tabela enquanto o SQL suporta apenas um por tabela. Neste caso, uma única tabela em Oracle pode mapear múltiplas tabelas em SQL Server. Por causa de tais diferenças, migrar os dados entre bancos de dados pode não ser uma simples cópia de tabelas, porque as novas estruturas de tabela podem ser um pouco diferentes das antigas. Há muitos anos já existem ferramentas disponíveis para ajudar na definição manual de esquemas de banco de dados. Existe outro conjunto de ferramentas para transformar e mover fisicamente grandes bancos de dados entre plataformas. O Schema & Data Migrator (SSMA) converte automaticamente um esquema de banco de dados em Oracle (tabelas, restrições, índices) em um esquema em Microsoft SQL Server, migrando os dados fisicamente para ocupar o novo banco de dados. Quando o SSMA inicia, o usuário se conecta com: O banco de dados de origem em Oracle especificando os seguintes parâmetros: Hotsname, port, SID, username, password. O banco de dados de destino em Microsoft SQL Server (SQL SERVER) especificando os seguintes parâmetros: Microsoft SQL Server Migration Assistant 3 Hostname, port, instance name, database name, schema, username, password. O usuário verá a seguinte interface gráfica: A metade superior representa os objetos do banco de dados de origem, acessível através dos controles de navegação à esquerda. Semelhantemente, a metade inferior apresenta objetos traduzidos prontos para a inserção no banco de dados de origem. O usuário pode selecionar os objetos de origem, neste caso do banco de dados em Oracle (padrão ou qualquer outro esquema), que serão convertidos no esquema do SQL Server. Os objetos convertidos podem então ser pesquisados na metade inferior da tela. Além disso, depois que o usuário verifica os objetos gerados e possivelmente faz alguma revisão no esquema, ele pode gerar um script para carregar o esquema gerado no SQL Server. Para funções e procedimentos de sistema Oracle que não têm contrapartes em SQL Server, há um de banco de dados SYSDB com esquema SYS, e os scripts de instalação carregarão UDFs, procedimentos armazenados, e procedimentos armazenados estendidos que emulam o comportamento de objetos em Oracle. Quando uma tabela é salva com script, dois arquivos são produzidos: um com definições de tabela e índice, e outra com restrições e triggers. Uma nova coluna ROWID de tipo de dados de identificador exclusivo com valor padrão NEWID() será adicionado a cada tabela convertida para auxiliar com as conversões de trigger. Mapeamento de tipo de dados Quando da conversão de tabelas, os tipos de dados escalares serão convertidos em tipos de dados em SQL Server baseados nas regras a seguir: varchar2 → varchar char → char number → numeric date → datetime long → text Microsoft SQL Server Migration Assistant 4 nvarchar2 → nvarchar boolean → smallint Mapeamento e conversão de restrições Padrões em Oracle serão convertidos em padrões em SQL Server, chaves primárias em chaves primárias, chaves exclusivas em chaves exclusivas, chaves externas em chaves externas, restrições NOT NULL em NOT NULL, restrições de verificação em restrições de verificação. Padrões, chaves primárias, exclusivas e externas conservarão seus nomes. Conversão de visualização (view) Visualizações em Oracle serão convertidas em visualizações em SQL Server. Conversão de índices Índices em Oracle serão convertidos em índices em SQL Server. Conversão de seqüência Seqüências em Oracle serão emuladas em SQL SERVER usando uma tabela e duas funções. Cada seqüência será representada como uma linha em uma tabela SequenceEmulator . SeqName.CURRVAL será convertida em uma chamada de função db_get_curr_sequence_value. SeqName.NEXTVAL será convertida em uma chamada de função db_get_next_sequence_value. Migração de Dados Existe outro conjunto de ferramentas para transformar e mover fisicamente grandes bancos de dados entre plataformas. O Schema & Data Migrator (SSMA) converte automaticamente um esquema em Oracle (tabelas, restrições, índices) em um esquema em Microsoft SQL Server, migrando fisicamente os dados para ocupar o novo banco de dados. Depois que o esquema é convertido, os dados podem ser migrados. Serão migrados numa base de tabela em tabela ou todas as tabelas selecionadas de uma só vez. Como o processo de migração de dados insere registros na tabela de destino, é responsabilidade do usuário cuidar que nenhuma restrição ou trigger evite que os registros sejam inseridos na tabela. Conversão da Lógica de Negócio Como notado anteriormente, a complexidade do banco de dados do ponto de vista de uma migração é uma função do número de objetos de lógica de negócio que ele contém, do tamanho desses objetos e dos recursos particulares da linguagem usada para implementálos. Uma complexidade adicional deriva de diferenças nas bibliotecas de função do sistema fornecidas nas duas plataformas. Por exemplo, a linguagem de procedimento armazenada, PL/SQL, possui muitos recursos não suportados em Transact-SQL (T-SQL), a linguagem de procedimento armazenada do SQL Server, e mesmo onde existem recursos similares, as linguagens contêm muitas diferenças sintáticas e semânticas. Para migrar um objeto em PL/SQL que usa um recurso que não possui uma contraparte em T-SQL requer que essa capacidade seja emulada em TSQL usando os recursos disponíveis. Desenvolver uma boa emulação pode ser bastante sutil e demorado. De fato, várias sutilezas precisam ser tratadas na migração seja para desenvolver emulações para recursos que faltam como para esclarecer diferenças semânticas em recursos correspondentes. Microsoft SQL Server Migration Assistant 5 Conversão de SQL Os ingressos externos de forma (+) no Oracle serão convertidos em ingressos externos do padrão ANSI no SQL Server. Dicas em Oracle serão convertidas em dicas em SQL Server. As dicas atualmente suportadas incluem FIRST_ROWS, INDEX (tablename indexname), APPEND, MERGE_AJ, MERGE_SJ, MERGE(tablename). Algumas das dicas em Oracle não têm equivalentes em SQL Server, e serão ignoradas. Exemplo: Oracle select /*+ first_rows index (rank_table ix_rank_table_1) */ r_id from rank_table; Microsoft SQL Server select r_id from rank_table with (index (ix_rank_table_1)) option (fast 1) O tipo Booleano de dados em Oracle é convertido em smallint em SQL Server, usando várias regras. Exemplo: Oracle declare v1 boolean := true; v2 boolean := false; … begin … v1 := (x>3) and v2; end;; Microsoft SQL Server Declare @v1 smallint, @v2 smallint set @v1 = /* TRUE */ 1 set @v2 = /* FALSE */ 0 begin set @a = case when ((@x>3) and (@v2 <> /* FALSE */ 0)) THEN /*TRUE*/ 1 ELSE /*FALSE*/ 0 end end Procedimento armazenando e conversão de função Procedimentos armazenados em Oracle serão convertidos em procedimentos armazenados em SQL Server. Cadeias de parâmetros com extensão não especificada serão convertidas e um aviso será relatado. Parâmetros numéricos com extensão e precisão não especificadas serão convertidos em numeric(38, 10) e um aviso será relatado. Funções em Oracle serão convertidas em funções definidas pelo usuário em SQL Server. Uma função contendo instruções UPDATE/INSERT/DELETE será substituída por uma função e um procedimento armazenado contendo o corpo da função de origem em Oracle. Uma função contendo um parâmetro de saída será substituída por um procedimento armazenado. Existe um número limitado de casos em que tal substituição pode não ser totalmente equivalente, e esses casos devem ser manejados manualmente. Conversão de trigger Triggers serão convertidos em triggers com base nas seguintes regras: Triggers BEFORE serão convertidos em triggers INSTEAD OF. Triggers AFTER serão convertidos em triggers AFTER. Triggers de nível de linha serão emulados usando processamento de cursos. Microsoft SQL Server Migration Assistant 6 Múltiplos triggers definidos na mesma operação serão combinados em um trigger. Exemplo: Oracle create trigger tr_bi_rank_table before insert on rank_table for each row begin select seq_rank_id.nextval into :new.r_id from sys.dual; end; Microsoft SQL Server create trigger instead_of_insert_on_rank_table on rank_table instead of insert as /* begin of trigger implementation */ set nocount on /* column variables declaration */ declare @column_new_value____1 numeric, @column_new_value____2 varchar(50), @column_new_value____3 numeric, @column_new_value____4 char(1) /* iterate for each row from inserted/deleted tables*/ declare ForEachInsertedRowTriggerCursor cursor local forward_only read_only for select “RANK”, “RANK_NAME”, “R_ID”, “R_SN” from inserted open ForEachInsertedRowTriggerCursor fetch next from ForEachInsertedRowTriggerCursor into @column_new_value____1,@column_new_value____2, @column_new_value____3,@column_new_value____4 while @@fetch_status = 0 begin /* Oracle trigger tr_bi_rank_table implementation: begin*/ begin select @ column_new_value____3 = SYSDB.SYS.DB_GET_NEXT_SEQUENCE_VALUE (‘SCHEMA_NAME’, ‘SEQ_RANK_ID’) end /* Oracle trigger tr_bi_rank_table implementation: end*/ /* DML-operation emulation */ insert into rank_table (“RANK”, “RANK_NAME”, “R_ID”, “R_SN)” values (@column_new_value____1,@column_new_value____2, @column_new_value____3,@column_new_value____4) fetch next from ForEachInsertedRowTriggerCursor into @column_new_value____1,@column_new_value____2, @column_new_value____3,@column_new_value____4 end close ForEachInsertedRowTriggerCursor deallocate ForEachInsertedRowTriggerCursor Microsoft SQL Server Migration Assistant 7 /* end of trigger implementation */ Conversão de pacotes Funções de pacote serão convertidas em funções definidas pelo usuário usando a convenção de nomeação PackageName_FunctionName. Procedimentos de pacote serão convertidos em procedimentos armazenados usando a convenção de nomeação PackageName_ProcedureName. Variáveis de pacote serão emuladas usando uma tabela e um conjunto de funções. Funções de sistema Funções de sistema serão convertidas em funções de sistema do Microsoft SQL Server ou funções definidas pelo usuário a partir da biblioteca de funções de sistema fornecida. Instruções de controle A instrução IF será convertida na instrução IF. As instruções IF-ELSIF… ELSIF-ELSE-END IF serão convertidas em instruções IF aninhadas. A instrução NULL será convertida em uma chamada para o procedimento SYSDB.SYS.DB_NULL_STATEMENT. Exemplo: Oracle declare v1 numeric; begin v1 := 1; if v1 > 1 then dbms_output.put_line (‘1>1’); v1 := 100; elseif v1 > 2 then dbms_output.put_line (‘1 > 2’); v1 := 200; else dbms_output.put_line (‘None’); null; end if; end; Microsoft SQL Server declare @v1 numeric begin set @v1 = 1 if (@v1 > 1) begin print ‘1>1’ set @v1 = 100 end else if (@v1 > 2) begin print ‘1>2’ set @v1 = 200 end else begin print ‘None’ exec SYSDB.SYS.DB_NULL_STATEMENT end end A instrução CASE será convertida na instrução CASE. A instrução GOTO será convertida na instrução GOTO. Instruções de loop A instrução LOOP (com EXIT ou EXIT WHEN) será convertida na instrução WHILE (1=1) com instrução BREAK. Exemplo: Oracle Microsoft SQL Server Migration Assistant Microsoft SQL Server 8 loop exit when rank > max_rank; do something; rank := rank + 1; end loop; while (1 =1) begin if @rank > @max_rank break do something set @rank = @rank + 1 end A instrução WHILE será convertida na instrução WHILE. Exemplo: Oracle while rank <= max_rank loop do something; rank := rank + 1; end loop; Microsoft SQL Server while (@rank <= @max_rank) begin do something set @rank = @rank + 1 end O loop numérico FOR (incluindo a palavra-chave opcional REVERSE) será convertida na instrução WHILE. Exemplo: Oracle for rank in 1..max_rank loop do something; end loop; Microsoft SQL Server declare @rank int set @rank = 1 while (@rank <= max_rank) begin do something set @rank = @rank + 1 end Conversão do cursor Os cursores serão convertidos em cursores. Os atributos do cursor serão convertidos como se segue: o o o o cursor_name%NOTFOUND (@@FETCH_STATUS = -1) cursor_name%FOUND (@@FETCH_STATUS = 0) cursor_name%ISOPEN (cursor_status (‘local’, ‘cursor_name’) = 1) cursor_name%ROWCOUNT @v_cursor_name_rowcount declarado e incrementado após cada operação de busca Exemplo: Oracle Declare cursor rank_cur is select rank, rank_name from rank_table; rank_rec rank_cur%ROWTYPE; begin open rank_cur; loop fetch rank_cur into rank_rec; exit when rank_cur%NOTFOUND; do something; end loop; Microsoft SQL Server Migration Assistant Microsoft SQL Server Declare @v_rank_cur_rowcount int, @rank numeric, @rank_name varchar(50) declare rank_cur cursor for select rank, rank_name from rank_table; begin open rank_cur set @v_rank_cur_rowcount = 0 while (1=1) 9 close rank_cur; end; begin fetch next from rank_cur into @rank, @rank_name set @v_rank_cur_rowcount = @v_rank_cur_rowcount + 1 if (@@fetch_status = -1) break do something end close rank_cur deallocate rank_cur end Cursores com parâmetros serão convertidos em múltiplos cursores. Exemplo: Oracle declare cursor rank_cur (id number, sn char(1)) is select rank, rank_name from rank_table where r_id = id and r_sn = sn; begin open rank_cur (1, ‘c’); open rank_cur (2, ‘d’); end; Microsoft SQL Server declare @id numeric, @sn char(1) begin set @id = 1 set @sn = ‘c’ declare rank_cur_1 cursor for select rank, rank_name from rank_table where r_id = @id and r_sn = @sn open rank_cur_1 set @id = 2 set @sn = ‘d’ declare rank_cur_2 cursor for select rank, rank_name from rank_table where r_id = @id and r_sn = @sn open rank_cur_2 end O loop de cursor FOR será convertido em um cursor com variáveis locais. CLOSE cursor_name será convertido em CLOSE cursor_name e DEALLOCATE cursor_name. Conversão de RETURN A instrução RETURN será convertida na instrução RETURN. Conversão de comentários Comentários serão convertidos em comentários. Microsoft SQL Server Migration Assistant 10 Conversão de declaração variável. Declarações variáveis estáticas serão convertidas em declarações variáveis. Declarações variáveis incluindo %TYPE têm os dados de coluna determinados no momento da conversão. Por exemplo, se uma variável é declarada da seguinte forma: var1 table1.col1%TYPE; e a col1 em table1 tem o tipo de dado varchar2(50), então será convertido em: var1 varchar(50) Declarações variáveis incluindo %ROWTYPE em Oracle serão convertidas em um grupo de variáveis locais em SQL Server. RECORDs em Oracle serão convertidos em um grupo de variáveis locais em SQL Server. Exemplo: Oracle create or replace procedure test_proc ( arg_rec1 table1%ROWTYPE; arg_rec2 table2%ROWTYPE; ) as type rec is record ( col1 int; col2 table1.c1%TYPE; col3 varchar2(32) ); rec1 rec; begin rec1 := NULL; rec1 := arg_rec1; rec1.col2 := arg_rec2.col1_table1; end; Microsoft SQL Server create procedure test_proc @arg_rec1_col1_table1 numeric (38), @arg_rec1_col2_table1 numeric (38), @arg_rec1_col3_table1 varchar (32), @arg_rec2_col1_table1 numeric (38), @arg_rec2_col2_table1 numeric (38), @arg_rec2_col3_table1 varchar (32) as declare @rec1_col1 int, @rec1_col2 numeric, @rec1_col3 varchar (32) begin set @rec1_col1 = null set @rec1_col2 = null set @rec1_col3 = null set @rec1_col1 = @arg_rec1_col1_table1 set @rec1_col2 = @arg_rec1_col2_table1 set @rec1_col3 = @arg_rec1_col3_table1 set @rec1_col2 = @arg_rec2_col1_table1 end Conversão de exceção Exceções serão emuladas em Transact-SQL. A emulação pode ser ativada ou desativada. Se estiver desativada, não ocorrerá nenhum manejo de exceção em SQL Server. Se a emulação estiver ativada, exceções definidas pelo usuário e do sistema são convertidas usando as instruções IF, GOTO e funções definidas pelo usuário. As exceções de sistema atualmente suportadas incluem NO_DATA_FOUND e TOO_MANY_ROWS. Todas as exceções de usuário são suportadas. Conversão de chamadas de procedimento e de função Chamadas de procedimento serão convertidas em chamadas de procedimento. Chamadas de função serão convertidas em chamadas de função. Microsoft SQL Server Migration Assistant 11 Conversão de gerenciamento de transação Instruções BEGIN TRAN, COMMIT, e ROLLBACK em Oracle serão convertidas nas instruções BEGIN TRAN, COMMIT, e ROLLBACK correspondentes em SQL Server. Como em Oracle as transações são automaticamente iniciadas quando uma operação DML é realizada, em SQL Server nós permitimos transações implícitas usando a instrução SET IMPLICIT_TRANSACTIONS ON ou usaremos BEGIN TRAN e COMMIT TRAN. SAVEPOINT será convertida em SAVE TRANSACTION. Validação, Integração e Análise de Desempenho A ferramenta de visualização Zebra Visualization Tool estende a interface gráfica para tratar da necessidade de testar assim como possibilitar ao usuário que siga o processo de migração automatizada. Depois que o código PL/SQL foi convertido, esta ferramenta permite que usuário pesquise facilmente o código e encontre as estruturas de código correspondentes. Basta clicar no componente colorido em uma janela e para se ver o componente correspondente convertido na segunda janela. A tomada de tela a seguir mostra como esta correspondência é apresentada usando faixas codificadas por cores. Depois que alguns objetos são convertidos, o espaço de trabalho pode ser sincronizado tanto com o banco de dados de origem como com o de destino. A sincronização pode ser configurada com as seguintes: Sempre sobrescrever objetos do banco de dados com objetos do espaço de trabalho local. Sempre sobrescrever objetos do espaço de trabalho local com objetos do banco de dados. Mesclar automaticamente os objetos com base na última data de alteração. Microsoft SQL Server Migration Assistant 12 Conclusão O SQL Server Migration Assistant permite que os clientes migrem suas aplicações a partir de bancos de dados diferentes para o SQL Server de uma maneira fácil e previsível. O Microsoft SQL Server Migration Assistant automatiza quase todos os aspectos da migração de bancos de dados. Como resultado, o tempo, custo e riscos associados com a migração para SQL Server são drasticamente reduzidos. Com o SQL Server Migration Assistant os clientes não precisam mais de ficar restritos a um banco de dados caro. Este é um documento preliminar e pode ser alterado substancialmente antes do lançamento comercial definitivo do software aqui descrito. As informações contidas neste documento representam a visão atual da Microsoft Corporation sobre os assuntos discutidos na data de sua publicação. Como a Microsoft deve reagir a condições variáveis de mercado, não devem ser interpretadas como um compromisso da parte da Microsoft e a Microsoft não pode garantir a precisão de qualquer informação apresentada depois da data da publicação. Este relatório é para propósitos de informação apenas. A MICROSOFT NÃO DÁ GARANTIAS, EXPRESSAS, IMPLÍCITAS OU ESTATUTÁRIAS, QUANTO ÀS INFORMAÇÕES NESTE DOCUMENTO. É responsabilidade do usuário acatar a todas as leis aplicáveis de direitos autorais. Sem limitar os direitos sob o direito autoral, nenhuma parte deste documento pode ser reproduzida, armazenada ou introduzida em sistema de memória, ou transmitida em qualquer forma ou por qualquer meio (eletrônico, mecânico, fotocópia, gravação ou outra maneira), ou, para qualquer fim, sem a permissão expressa por escrito da Microsoft Corporation. A Microsoft pode possuir patentes, pedidos de patentes, marcas registradas, direitos autorais ou outros direitos de propriedade intelectual cobrindo o assunto deste documento. Exceto quanto expressamente estipulado em qualquer contrato de licença da Microsoft, o fornecimento deste documento não proporciona nenhuma licença daquelas patentes, marcas registradas, direitos autorais ou outras propriedades intelectuais. © 2001 Microsoft Corporation. Todos os direitos reservados. Microsoft, Windows, a logomarca Windows, Windows Server System, Visual Studio, SQL Server, e SQL Server Migration Assistant, são marcas registradas ou marcas comerciais da Microsoft Corporation nos United States e/ou outros países. Os nomes de empresas e produtos reais aqui mencionados podem ser marcas registradas de seus respectivos proprietários. Microsoft SQL Server Migration Assistant 13