

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Conecte Microsoft SQL Servers com AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer"></a>

Você pode usar AWS SCT para converter esquemas, objetos de código de banco de dados e código de aplicativo do SQL Server para os seguintes destinos: 
+ Amazon RDS para MySQL
+ Amazon Aurora Edição Compatível com MySQL
+ Amazon RDS para PostgreSQL
+ Amazon Aurora Edição Compatível com PostgreSQL
+ Amazon RDS para SQL Server
+ Amazon RDS para MariaDB

**nota**  
AWS SCT não oferece suporte ao uso do Amazon RDS para SQL server como fonte.

Você pode usar AWS SCT para criar um relatório de avaliação para a migração de esquemas, objetos de código de banco de dados e código de aplicativo do SQL Server para o Babelfish para o Aurora PostgreSQL, conforme descrito a seguir.

**Topics**
+ [Privilégios do Microsoft SQL Server como origem](#CHAP_Source.SQLServer.Permissions)
+ [Usando a autenticação do Windows ao usar o Microsoft SQL Server como origem](#CHAP_Source.SQLServer.Permissions.WinAuth)
+ [Conectando-se ao SQL Server como origem](#CHAP_Source.SQLServer.Connecting)
+ [Convertendo o SQL Server em MySQL](CHAP_Source.SQLServer.ToMySQL.md)
+ [Migrando do SQL Server para o PostgreSQL com AWS Schema Conversion Tool](CHAP_Source.SQLServer.ToPostgreSQL.md)
+ [Migração do SQL Server para o Amazon RDS for SQL Server com AWS Schema Conversion Tool](CHAP_Source.SQLServer.ToRDSSQLServer.md)

## Privilégios do Microsoft SQL Server como origem
<a name="CHAP_Source.SQLServer.Permissions"></a>

Os privilégios obrigatórios para Microsoft SQL Server como origem são listados a seguir: 
+ VIEW DEFINITION
+ VIEW DATABASE STATE

O `VIEW DEFINITION` privilégio permite que usuários com acesso público vejam as definições de objetos. AWS SCT usa o `VIEW DATABASE STATE` privilégio para verificar os recursos da edição SQL Server Enterprise.

Repetir a concessão para cada banco de dados cujo esquema que você está convertendo.

Além disso, conceda os seguintes privilégios no banco de dados `master`:
+ VIEW SERVER STATE
+ VIEW ANY DEFINITION

AWS SCT usa o `VIEW SERVER STATE` privilégio para coletar as definições e configurações do servidor. Certifique-se de conceder o privilégio `VIEW ANY DEFINITION` de visualizar endpoints.

Para ler as informações sobre o Microsoft Analysis Services, execute o comando a seguir no banco de dados `master`.

```
EXEC master..sp_addsrvrolemember @loginame = N'<user_name>', @rolename = N'sysadmin'
```

No exemplo anterior, substitua o espaço reservado `<user_name>` pelo nome do usuário que você concedeu com os privilégios anteriores.

Para ler informações sobre o SQL Server Agent, adicione seu usuário ao perfil `SQLAgentUser`. Execute o comando a seguir no banco de dados `msdb`.

```
EXEC sp_addrolemember <SQLAgentRole>, <user_name>;
```

No exemplo anterior, substitua o espaço reservado `<SQLAgentRole>` pelo nome do perfil do SQL Server Agent. Em seguida, substitua o espaço reservado `<user_name>` pelo nome do usuário que você concedeu com os privilégios anteriores. Para obter mais informações, consulte [Adicionar um usuário à função de SQLAgent usuário](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.SQLServer.CommonDBATasks.Agent.html#SQLServerAgent.AddUser) no *Guia do usuário do Amazon RDS*.

Para detectar o envio de logs, conceda o privilégio `SELECT on dbo.log_shipping_primary_databases` no banco de dados `msdb`.

Para usar a abordagem de notificação da replicação DDL, conceda o privilégio `RECEIVE ON <schema_name>.<queue_name>` em seus bancos de dados de origem. Neste exemplo, substitua o espaço reservado `<schema_name>` pelo nome do esquema do banco de dados. Substitua o espaço reservado `<queue_name>` pelo nome de uma tabela de filas.

## Usando a autenticação do Windows ao usar o Microsoft SQL Server como origem
<a name="CHAP_Source.SQLServer.Permissions.WinAuth"></a>

Se o seu aplicativo for executado em uma intranet baseada no Windows, você poderá usar a autenticação do Windows para acesso ao banco de dados. A autenticação do Windows usa a identidade atual do Windows estabelecida no thread do sistema operacional para acessar o banco de dados do SQL Server. Em seguida, você pode mapear a identidade do Windows para um banco de dados e para as permissões do SQL Server. Para se conectar ao SQL Server usando a autenticação do Windows, você deve especificar a identidade do Windows que seu aplicativo está usando. Também é necessário conceder o acesso de identidade do Windows ao banco de dados do SQL Server.

O SQL Server possui dois modos de acesso: modo de autenticação do Windows e modo misto. O modo de autenticação do Windows habilita a autenticação do Windows e desabilita a autenticação do SQL Server. O modo misto habilita a autenticação do Windows e a autenticação do SQL Server. A autenticação do Windows está sempre disponível e não pode ser desativada. Para obter mais informações sobre a autenticação do Windows, consulte a documentação do Microsoft Windows. 

Um possível exemplo de criação de usuário no TEST\$1DB é mostrado abaixo.

```
USE [TEST_DB]
CREATE USER [TestUser] FOR LOGIN [TestDomain\TestUser]
GRANT VIEW DEFINITION TO [TestUser]
GRANT VIEW DATABASE STATE TO [TestUser]
```

### Usando a autenticação do Windows com uma conexão JDBC
<a name="CHAP_Source.SQLServer.Permissions.WinAuth.JDBC"></a>

O driver JDBC não oferece suporte à autenticação do Windows quando o driver é usado em sistemas operacionais que não sejam Windows. Credenciais de autenticação do Windows, como nome de usuário e senha, não são automaticamente especificados ao se conectar ao SQL Server a partir de sistemas operacionais que não sejam Windows. Nesses casos, os aplicativos devem usar a autenticação do SQL Server.

Na string de conexão JDBC, o parâmetro `integratedSecurity` deve ser especificado para se conectar usando a autenticação do Windows. O driver JDBC oferece suporte à autenticação integrada do Windows em sistemas operacionais Windows por meio do parâmetro de string de conexão `integratedSecurity`.

Para usar a autenticação integrada.

1. Instalar o driver de JDBC.

1. Copie o arquivo `sqljdbc_auth.dll` para um diretório no caminho do sistema Windows no computador em que o driver JDBC está instalado.

   Os arquivos `sqljdbc_auth.dll` são instalados no seguinte local:

   <*diretório de instalação*>\$1sqljdbc\$1<*versão*>\$1<*linguagem*>\$1auth\$1

Ao tentar estabelecer uma conexão com o banco de dados do SQL Server usando a autenticação do Windows, você pode receber o erro: Este driver não está configurado para autenticação integrada. Esse problema pode ser resolvido executando as seguintes ações:
+ Declare duas variáveis que indicam o caminho instalado do seu JDBC:

   `variable name: SQLJDBC_HOME; variable value: D:\lib\JDBC4.1\enu` (onde seu sqljdbc4.jar existe);

  `variable name: SQLJDBC_AUTH_HOME; variable value: D\lib\JDBC4.1\enu\auth\x86` (se estiver executando um sistema operacional de 32 bits) ou `D\lib\JDBC4.1\enu\auth\x64` (se estiver executando um sistema operacional de 64 bits). É aqui que o seu `sqljdbc_auth.dll` está localizado. 
+ Copie `sqljdbc_auth.dll` para a pasta em que o seu JDK/JRE está sendo executado. Você pode copiar na pasta lib, bin, etc. Por exemplo, você pode copiar na pasta a seguir.

  ```
  [JDK_INSTALLED_PATH]\bin;
  [JDK_INSTALLED_PATH]\jre\bin;
  [JDK_INSTALLED_PATH]\jre\lib;
  [JDK_INSTALLED_PATH]\lib;
  ```
+ Certifique-se de que, na pasta da biblioteca JDBC, você tenha somente o SQLJDBC4 arquivo.jar. Remova qualquer outro arquivo sqljdbc\$1.jar dessa pasta (ou copie em outra pasta). Se você estiver adicionando o driver como parte do seu programa, certifique-se de adicionar somente SQLJDBC4 o.jar como o driver a ser usado.
+ Copie o arquivo sqljdbc\$1auth.dll na pasta com o aplicativo.

**nota**  
Se você estiver executando uma Java Virtual Machine (JVM) de 32 bits, use o arquivo sqljdbc\$1auth.dll na pasta x86, mesmo se o sistema operacional for a versão x64. Se você estiver executando uma JVM de 64 bits em um processador x64, use o arquivo sqljdbc\$1auth.dll na pasta x64.

Ao se conectar a um banco de dados do SQL Server, você pode escolher a **Autenticação do Windows** ou a **Autenticação do SQL Server** para a opção **Autenticação**.

## Conectando-se ao SQL Server como origem
<a name="CHAP_Source.SQLServer.Connecting"></a>

Use o procedimento a seguir para se conectar ao banco de dados de origem do Microsoft SQL Server com a AWS Schema Conversion Tool. 

**Para conectar-se a um banco de dados de origem do Microsoft SQL Server**

1. No AWS Schema Conversion Tool, escolha **Adicionar fonte**.

1. Escolha **Microsoft SQL Server** e, em seguida, escolha **Avançar**. 

   A caixa de diálogo **Adicionar origem** é exibida.

1. Em **Nome da conexão**, insira um nome para o banco de dados. A AWS SCT exibe esse nome na árvore no painel esquerdo. 

1. Use as credenciais do banco de dados AWS Secrets Manager ou insira-as manualmente:
   + Para usar as credenciais do banco de dados do Secrets Manager, use as instruções a seguir:

     1. Em **AWS Secret**, escolha o nome do segredo.

     1. Escolha **Preencher** para preencher automaticamente todos os valores na caixa de diálogo de conexão do banco de dados do Secrets Manager.

     Para obter informações sobre o uso de credenciais de banco de dados do Secrets Manager, consulte a [Configurando AWS Secrets Manager no AWS Schema Conversion Tool](CHAP_UserInterface.SecretsManager.md).
   + Para inserir manualmente as informações de conexão do banco de dados de origem do Microsoft SQL Server, use as instruções a seguir:  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.html)

1. Escolha **Testar conexão** para verificar se AWS SCT pode se conectar ao seu banco de dados de origem. 

1. Escolha **Conectar** para se conectar ao banco de dados de origem.

# Convertendo o SQL Server em MySQL
<a name="CHAP_Source.SQLServer.ToMySQL"></a>

Para emular funções de banco de dados do Microsoft SQL Server em seu código MySQL convertido, use o pacote de extensão SQL Server para MySQL em AWS SCT. Para obter mais informações sobre pacotes de extensão, consulte [Usando pacotes de extensão com AWS Schema Conversion Tool](CHAP_ExtensionPack.md). 

**Topics**
+ [Privilégios do MySQL como um banco de dados de destino](#CHAP_Source.SQLServer.ToMySQL.ConfigureTarget)
+ [Configurações de conversão do SQL Server para MySQL](#CHAP_Source.SQLServer.ToMySQL.ConversionSettings)
+ [Considerações sobre a migração](#CHAP_Source.SQLServer.ToMySQL.MigrationConsiderations)

## Privilégios do MySQL como um banco de dados de destino
<a name="CHAP_Source.SQLServer.ToMySQL.ConfigureTarget"></a>

Os privilégios obrigatórios para MySQL como destino são listados a seguir:
+ CREATE ON \$1.\$1
+ ALTER ON \$1.\$1
+ DROP ON \$1.\$1
+ INDEX ON \$1.\$1
+ REFERENCES ON \$1.\$1
+ SELECT ON \$1.\$1
+ CREATE VIEW ON \$1.\$1
+ SHOW VIEW ON \$1.\$1
+ TRIGGER ON \$1.\$1
+ CREATE ROUTINE ON \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ INSIRA, ATUALIZE EM AWS\$1SQLSERVER \$1EXT. \$1
+ INSIRA, ATUALIZE E EXCLUA EM AWS\$1SQLSERVER \$1EXT\$1DATA. \$1
+ CRIE TABELAS TEMPORÁRIAS EM AWS\$1SQLSERVER \$1EXT\$1DATA. \$1

É possível utilizar o exemplo de código a seguir para criar um usuário do banco de dados e conceder os privilégios.

```
CREATE USER 'user_name' IDENTIFIED BY 'your_password';
GRANT CREATE ON *.* TO 'user_name';
GRANT ALTER ON *.* TO 'user_name';
GRANT DROP ON *.* TO 'user_name';
GRANT INDEX ON *.* TO 'user_name';
GRANT REFERENCES ON *.* TO 'user_name';
GRANT SELECT ON *.* TO 'user_name';
GRANT CREATE VIEW ON *.* TO 'user_name';
GRANT SHOW VIEW ON *.* TO 'user_name';
GRANT TRIGGER ON *.* TO 'user_name';
GRANT CREATE ROUTINE ON *.* TO 'user_name';
GRANT ALTER ROUTINE ON *.* TO 'user_name';
GRANT EXECUTE ON *.* TO 'user_name';
GRANT INSERT, UPDATE ON AWS_SQLSERVER_EXT.* TO 'user_name';
GRANT INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
GRANT CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
```

No exemplo anterior, *user\$1name* substitua pelo nome do seu usuário. Em seguida, *your\$1password* substitua por uma senha segura.

Se você usar um banco de dados MySQL versão 5.7 ou inferior como destino, execute o comando a seguir. Para bancos de dados MySQL versão 8.0 e superior, esse comando está obsoleto.

```
GRANT SELECT ON mysql.proc TO 'user_name';
```

Para usar o Amazon RDS para MySQL ou o Aurora MySQL como destino, defina o parâmetro `lower_case_table_names` como `1`. Esse valor significa que o servidor MySQL manipula identificadores de nomes de objetos como tabelas, índices, acionadores e bancos de dados sem distinção entre maiúsculas e minúsculas. Se você ativou o registro binário em sua instância de destino, defina o parâmetro `log_bin_trust_function_creators` como `1`. Nesse caso, você não precisa usar as características `DETERMINISTIC`, `READS SQL DATA` ou `NO SQL` para criar funções armazenadas. Para configurar esses parâmetros, crie um novo grupo de parâmetros de banco de dados ou modifique um grupo de parâmetros de banco de dados existente.

## Configurações de conversão do SQL Server para MySQL
<a name="CHAP_Source.SQLServer.ToMySQL.ConversionSettings"></a>

Para editar as configurações de conversão do SQL Server para MySQL, AWS SCT escolha **Configurações** e, em seguida, escolha Configurações **de conversão**. Na lista superior, escolha **SQL Server** e, em seguida, escolha **SQL Server: MySQL**. A AWS SCT exibe todas as configurações disponíveis para conversão de SQL Server para MySQL.

As configurações de conversão do SQL Server para MySQL AWS SCT incluem opções para o seguinte:
+ Para limitar o número de comentários com itens de ação no código convertido.

  Em **Adicionar comentários no código convertido para os itens de ação de severidade selecionada e superior**, escolha a severidade dos itens de ação. AWS SCT adiciona comentários no código convertido para itens de ação da severidade selecionada e superior.

  Por exemplo, para minimizar o número de comentários em seu código convertido, escolha **Somente erros**. Para incluir comentários para todos os itens de ação em seu código convertido, escolha **Todas as mensagens**.
+ Para permitir que seu banco de dados SQL Server de origem armazene a saída de `EXEC` em uma tabela. AWS SCT cria tabelas temporárias e um procedimento adicional para emular esse recurso. Para usar essa emulação, selecione **Criar rotinas adicionais para lidar com conjuntos de dados abertos**.

## Considerações sobre a migração
<a name="CHAP_Source.SQLServer.ToMySQL.MigrationConsiderations"></a>

Há alguns aspectos a serem considerados ao migrar um esquema do SQL Server para o MySQL:
+ O MySQL não é compatível com a instrução `MERGE`. No entanto, AWS SCT pode emular a `MERGE` declaração durante a conversão usando a `INSERT ON DUPLICATE KEY` cláusula e as `UPDATE FROM and DELETE FROM` declarações.

  Para emulação correta usando `INSERT ON DUPLICATE KEY`, é necessário que haja uma restrição ou chave primária no banco de dados MySQL de destino.
+ Uma instrução `GOTO` e um rótulo podem ser usados para alterar a ordem em que as instruções são executadas. Todas as instruções Transact-SQL que seguem a instrução `GOTO` são ignoradas, e o processamento continua no rótulo. As instruções `GOTO` e os rótulos podem ser usados em qualquer lugar em um procedimento, lote ou bloco de instruções. Você também pode aninhar instruções `GOTO`.

  O MySQL não usa instruções `GOTO`. Quando AWS SCT converte o código que contém uma `GOTO` instrução, ele converte a instrução para usar uma instrução `BEGIN…END` ou`LOOP…END LOOP`. Você pode encontrar exemplos de como AWS SCT converte `GOTO` declarações na tabela a seguir.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToMySQL.html)
+ O MySQL não oferece suporte a funções com valor de tabela de várias instruções. AWS SCT simula funções com valor de tabela durante uma conversão criando tabelas temporárias e reescrevendo instruções para usar essas tabelas temporárias.

# Migrando do SQL Server para o PostgreSQL com AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToPostgreSQL"></a>

Você pode usar o pacote de extensão SQL Server para PostgreSQL em AWS SCT. Esse pacote de extensão emula as funções do banco de dados do SQL Server no código PostgreSQL convertido. Use o pacote de extensão SQL Server para PostgreSQL para emular o SQL Server Agent e o SQL Server Database Mail. Para obter mais informações sobre pacotes de extensão, consulte [Usando pacotes de extensão com AWS Schema Conversion Tool](CHAP_ExtensionPack.md). 

**Topics**
+ [Privilégios do PostgreSQL como um banco de dados de destino](#CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL)
+ [Configurações de conversão do SQL Server para o PostgreSQL](#CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings)
+ [Converter as partições do SQL Server para as partições do PostgreSQL versão 10](#CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions)
+ [Considerações sobre a migração](#CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations)
+ [Usando um pacote AWS SCT de extensão para emular o SQL Server Agent no PostgreSQL](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.md)
+ [Usando um pacote AWS SCT de extensão para emular o SQL Server Database Mail no PostgreSQL](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.md)

## Privilégios do PostgreSQL como um banco de dados de destino
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL"></a>

Para usar o PostgreSQL como destino AWS SCT , é necessário o privilégio. `CREATE ON DATABASE` Certifique-se de conceder esse privilégio para cada banco de dados PostgreSQL de destino.

Para usar os sinônimos públicos convertidos, altere o caminho de pesquisa padrão do banco de dados para `"$user", public_synonyms, public`.

É possível utilizar o exemplo de código a seguir para criar um usuário do banco de dados e conceder os privilégios.

```
CREATE ROLE user_name LOGIN PASSWORD 'your_password';
GRANT CREATE ON DATABASE db_name TO user_name;
ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;
```

No exemplo anterior, *user\$1name* substitua pelo nome do seu usuário. Em seguida, *db\$1name* substitua pelo nome do seu banco de dados de destino. Por fim, *your\$1password* substitua por uma senha segura.

No PostgreSQL, apenas o proprietário do esquema ou um `superuser` pode descartar um esquema. O proprietário pode descartar um esquema e todos os objetos incluídos nesse esquema, mesmo que o proprietário do esquema não possua alguns de seus objetos.

Ao usar usuários diferentes para converter e aplicar esquemas diferentes ao banco de dados de destino, você pode receber uma mensagem de erro quando não AWS SCT consegue descartar um esquema. Para evitar essa mensagem de erro, use o perfil `superuser`. 

## Configurações de conversão do SQL Server para o PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings"></a>

Para editar as configurações de conversão do SQL Server para PostgreSQL, escolha **Configurações** e, em seguida, escolha **Configurações de conversão**. Na lista superior, escolha **SQL Server** e, em seguida, escolha **SQL Server: PostgreSQL**. A AWS SCT exibe todas as configurações disponíveis para conversão de SQL Server para PostgreSQL.

As configurações AWS SCT de conversão do SQL Server para PostgreSQL incluem opções para o seguinte:
+ Para limitar o número de comentários com itens de ação no código convertido.

  Em **Adicionar comentários no código convertido para os itens de ação de severidade selecionada e superior**, escolha a severidade dos itens de ação. AWS SCT adiciona comentários no código convertido para itens de ação da severidade selecionada e superior.

  Por exemplo, para minimizar o número de comentários em seu código convertido, escolha **Somente erros**. Para incluir comentários para todos os itens de ação em seu código convertido, escolha **Todas as mensagens**.
+ Para permitir o uso de índices com o mesmo nome em tabelas diferentes no SQL Server.

  No PostgreSQL, todos os nomes de índice que você usa no esquema devem ser exclusivos. Para garantir que isso AWS SCT gere nomes exclusivos para todos os seus índices, selecione **Gerar nomes exclusivos para índices**.
+ Para converter procedimentos do SQL Server em funções do PostgreSQL.

  A versão 10 e anteriores do PostgreSQL não oferece suporte a procedimentos. Para clientes que não estão familiarizados com o uso de procedimentos no PostgreSQL AWS SCT , podem converter procedimentos em funções. Para fazer isso, selecione **Converter procedimentos em perfis**.
+ Para emular a saída de `EXEC` em uma tabela.

  Seu banco de dados SQL Server de origem pode armazenar a saída de `EXEC` em uma tabela. A AWS SCT cria tabelas temporárias e um procedimento adicional para emular esse atributo. Para usar essa emulação, selecione **Criar rotinas adicionais para lidar com conjuntos de dados abertos**.
+ Para definir o modelo a ser usado para os nomes dos esquemas no código convertido. Para **Modelo de geração de nome de esquema**, escolha uma das opções a seguir:
  + **<source\$1db>**: Usa o nome do banco de dados SQL Server como o nome de um esquema no PostgreSQL.
  + **<source\$1schema>**: Usa o nome do esquema do SQL Server como o nome de um esquema no PostgreSQL.
  + **<source\$1db>\$1<schema>**: Usa uma combinação do banco de dados SQL Server e dos nomes do esquema como um nome de esquema no PostgreSQL.
+ Para manter as letras maiúsculas dos nomes dos objetos de origem.

  Para evitar a conversão de nomes de objetos em minúsculas, selecione **Evitar conversão para minúsculas para operações com distinção entre maiúsculas e minúsculas**. Essa opção se aplica somente ao ativar a opção de diferenciação de maiúsculas e minúsculas no banco de dados de destino.
+ Para manter os nomes dos parâmetros do seu banco de dados de origem.

  Para adicionar aspas duplas aos nomes dos parâmetros no código convertido, selecione **Manter nomes de parâmetros originais**.

## Converter as partições do SQL Server para as partições do PostgreSQL versão 10
<a name="CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions"></a>

Ao converter um banco de dados Microsoft SQL Server em Amazon Aurora Edição Compatível com PostgreSQL (Aurora PostgreSQL) ou o serviço de banco de dados relacional da Amazon para PostgreSQL (Amazon RDS para PostgreSQL), esteja ciente do seguinte.

No SQL Server, você cria partições com funções de partição. Ao fazer a conversão de uma tabela particionada do SQL Server para uma tabela particionada do PostgreSQL versão 10, atente-se aos possíveis problemas:
+ O SQL Server permite que você particione uma tabela usando uma coluna sem restrição NOT NULL. Nesse caso, todos os valores NULL passam para a partição mais à esquerda. O PostgreSQL não é compatível com os valores NULL para particionamento RANGE.
+ O SQL Server permite que você crie chaves primárias e exclusivas para tabelas particionadas. No PostgreSQL, é possível criar chaves primárias e exclusivas para cada partição diretamente. Assim, a restrição PRIMARY UNIQUE KEY deve ser removida da tabela pai ao migrar para o PostgreSQL. Os nomes de chaves resultantes assumem o formato `<original_key_name>_<partition_number>`.
+ O SQL Server permite que você crie a restrição de chave estrangeira para e de tabelas particionadas. O PostgreSQL não é compatível com chaves estrangeiras que referenciam tabelas particionadas. Além disso, o PostgreSQL não é compatível com as referências de chave estrangeira de uma tabela particionada para outra tabela.
+ O SQL Server permite que você crie índices para tabelas particionadas. No PostgreSQL, um índice deve ser criado para cada partição diretamente. Assim, os índices devem ser removidos das tabelas pai ao migrar para o PostgreSQL. Os nomes de índices resultantes assumem o formato `<original_index_name>_<partition_number>`.
+  O PostgreSQL não é compatível com índices particionados.

## Considerações sobre a migração
<a name="CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations"></a>

Há alguns aspectos a serem considerados ao migrar um esquema do SQL Server para o PostgreSQL: 
+ No PostgreSQL, todos os nomes de objeto em um esquema devem ser exclusivos, incluindo os índices. Os nomes de índice devem ser exclusivos no esquema da tabela-base. No SQL Server, um nome de índice pode ser o mesmo em tabelas diferentes.

  Para garantir a exclusividade dos nomes de índice, você tem AWS SCT a opção de gerar nomes de índice exclusivos se seus nomes de índice não forem exclusivos. Para isso, clique na opção **Generate unique index names (Gerar nomes de índice exclusivos)** nas propriedades do projeto. Por padrão, essa opção é habilitada. Se essa opção estiver habilitada, os nomes de índice exclusivos são criados usando o formato IX\$1table\$1name\$1index\$1name. Caso contrário, os nomes de índice não são alterados.
+ Uma instrução GOTO e um rótulo podem ser usados para alterar a ordem em que as instruções são executadas. Todas as instruções Transact-SQL que seguem a instrução GOTO são ignoradas, e o processamento continua no rótulo. As instruções GOTO e os rótulos podem ser usados em qualquer lugar dentro de um procedimento, lote ou bloco de instruções. Além disso, as instruções GOTO podem ser agrupadas.

  O PostgreSQL não usa instruções GOTO. Ao AWS SCT converter o código que contém uma instrução GOTO, ele converte a instrução para usar uma instrução BEGIN... END ou LOOP... END LOOP. Você pode encontrar exemplos de como AWS SCT converte instruções GOTO na tabela a seguir.  
**As instruções GOTO do SQL Server e as instruções PostgreSQL convertidas**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
+ O PostgreSQL não suporta uma instrução MERGE. AWS SCT emula o comportamento de uma instrução MERGE das seguintes formas:
  + Com a construção INSERT ON CONFLICT.
  + Com a instrução UPDATE FROM DML, como MERGE sem uma cláusula WHEN NOT MATCHED.
  + Ao usar CURSOR, como com uma cláusula MERGE com DELETE ou usando uma instrução de condição MERGE ON complexa.
+ AWS SCT pode adicionar gatilhos de banco de dados à árvore de objetos quando o Amazon RDS é o destino.
+ AWS SCT pode adicionar gatilhos em nível de servidor à árvore de objetos quando o Amazon RDS é o destino.
+ O SQL Server cria e gerencia tabelas `deleted` e `inserted` automaticamente. Você pode usar essas tabelas temporárias residentes na memória para testar os efeitos de determinadas modificações de dados e definir condições para ações de acionamento de DML. AWS SCT pode converter o uso dessas tabelas em declarações de gatilho DML.
+ AWS SCT pode adicionar servidores vinculados à árvore de objetos quando o Amazon RDS é o destino.
+ Ao migrar do Microsoft SQL Server para PostgreSQL, a função SUSER\$1SNAME incorporada é convertida da seguinte forma:
  + SUSER\$1SNAME – retorna o nome de login associado a um número de identificação de segurança (SID).
  + SUSER\$1SNAME(<server\$1user\$1sid>) – Sem suporte.
  + SUSER\$1SNAME CURRENT\$1USER () – Retorna o nome do usuário do contexto de execução atual.
  + SUSER\$1SNAME (NULL) – Retorna NULL.
+ A conversão de funções com valor de tabela é suportada. As funções com valor de tabela retornam uma tabela e podem substituir uma tabela em uma consulta.
+ PATINDEX retorna a posição inicial da primeira ocorrência de um padrão em uma expressão especificada em todos os tipos de dados de texto e caracteres válidos. Ele retornará zeros se o padrão não for encontrado. <pattern character><expression character varying>Ao converter do SQL Server para o Amazon RDS for AWS SCT PostgreSQL, substitui o código do aplicativo que usa PATINDEX por aws\$1sqlserver\$1ext.patindex (,).
+ No SQL Server, um tipo de tabela definido pelo usuário representa a definição de uma estrutura de tabela. Use um tipo de tabela definido pelo usuário para declarar parâmetros de valor de tabela para procedimentos armazenados ou funções. Você também pode usar um tipo de tabela definido pelo usuário para declarar variáveis de tabela que você deseja usar em um lote ou no corpo de um procedimento ou função armazenado. AWS SCT emulou esse tipo no PostgreSQL criando uma tabela temporária.

Ao converter do SQL Server para o PostgreSQL AWS SCT , converte objetos do sistema SQL Server em objetos reconhecíveis no PostgreSQL. A tabela a seguir mostra como os objetos do sistema foram convertidos. 

 


| Casos de uso do MS SQL Server | Substituição do PostgreSQL | 
| --- | --- | 
| SYS.SCHEMAS | AWS\$1SQLSERVER\$1EXT.SYS\$1ESQUEMAS | 
| SYS.TABLES | AWS\$1SQLSERVER\$1EXT.SYS\$1TABELAS | 
| SYS.VIEWS | AWS\$1SQLSERVER\$1EXT.SYS\$1VIEWS | 
| SYS.ALL\$1VIEWS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1VIEWS | 
| SYS.TYPES | AWS\$1SQLSERVERTIPOS \$1EXT.SYS | 
| SYS.COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1COLUNAS | 
| SYS.ALL\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1COLUMNS | 
| SYS.FOREIGN\$1KEYS | AWS\$1SQLSERVER\$1EXT.SYS\$1CHAVES ESTRANGEIRAS | 
| SYS.SYSFOREIGNKEYS | AWS\$1SQLSERVER\$1EXT.SYS\$1SYS CHAVES ESTRANGEIRAS | 
| SYS.FOREIGN\$1KEY\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1COLUNAS\$1CHAVE\$1ESTRANGEIRAS | 
| SYS.KEY\$1CONSTRAINTS | AWS\$1SQLSERVERRESTRIÇÕES \$1EXT.SYS\$1KEY\$1 | 
| SYS.IDENTITY\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1IDENTITY\$1COLUMNS | 
| SYS.PROCEDURES | AWS\$1SQLSERVERPROCEDIMENTOS \$1EXT.SYS | 
| SYS.INDEXES | AWS\$1SQLSERVER\$1EXT.SYS\$1INDEXES | 
| SYS.SYSINDEXES | AWS\$1SQLSERVERÍNDICES \$1EXT.SYS\$1SYS | 
| SYS.OBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1OBJECTS | 
| SYS.ALL\$1OBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1TODOS\$1OBJETOS | 
| SYS.SYSOBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSOBJECTS | 
| SYS.SQL\$1MODULES | AWS\$1SQLSERVER\$1EXT.SYS\$1SQL\$1MODULES | 
| SYS.DATABASES | AWS\$1SQLSERVER\$1EXT.SYS\$1BANCOS DE DADOS | 
| INFORMATION\$1SCHEMA.SCHEMATA  | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1SCHEMATA | 
| INFORMATION\$1SCHEMA.VIEWS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1VIEWS | 
| INFORMATION\$1SCHEMA.TABLES | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1TABLES | 
| INFORMATION\$1SCHEMA.COLUMNS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1COLUMNS | 
| INFORMATION\$1SCHEMA.CHECK\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CHECK\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.REFERENTIAL\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1REFERENTIAL\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.TABLE\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1TABLE\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.KEY\$1COLUMN\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1KEY\$1COLUMN\$1USAGE | 
| INFORMATION\$1SCHEMA.CONSTRAINT\$1TABLE\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CONSTRAINT\$1TABLE\$1USAGE  | 
| INFORMATION\$1SCHEMA.CONSTRAINT\$1COLUMN\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CONSTRAINT\$1COLUMN\$1USAGE  | 
| INFORMATION\$1SCHEMA.ROUTINES | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1ROTINAS | 
| SYS.SYSPROCESSES | AWS\$1SQLSERVERPROCESSOS \$1EXT.SYS\$1SYS | 
| sys.system\$1objects | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSTEM\$1OBJECTS | 

# Usando um pacote AWS SCT de extensão para emular o SQL Server Agent no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent"></a>

SQL Server Agent é um serviço do Microsoft Windows que executa trabalhos do SQL Server. SQL Server Agent pode executar trabalhos agendados em resposta a um evento específico ou sob demanda. Para obter mais informações sobre o SQL Server Agent, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent?view=sql-server-ver15).

O PostgreSQL não tem um equivalente para SQL Server Agent. Para emular os recursos do SQL Server Agent, AWS SCT cria um pacote de extensão. Este pacote de extensão usa AWS Lambda e Amazon CloudWatch. AWS Lambda implementa a interface que você usa para gerenciar agendamentos e executar trabalhos. A Amazon CloudWatch mantém as regras de programação.

AWS Lambda e a Amazon CloudWatch usam um parâmetro JSON para interagir. Esse parâmetro JSON tem a seguinte estrutura.

```
{
    "mode": mode,
    "parameters": {
        list of parameters
    },
    "callback": procedure name
}
```

No exemplo anterior, *`mode`* é o tipo da tarefa e `list of parameters` é um conjunto de parâmetros que dependem do tipo da tarefa. Além disso, `procedure name` é o nome do procedimento executado após a conclusão da tarefa.

AWS SCT usa uma função Lambda para controlar e executar trabalhos. A CloudWatch regra inicia a execução do trabalho e fornece as informações necessárias para iniciar o trabalho. Quando a CloudWatch regra é acionada, ela inicia a função Lambda usando os parâmetros da regra.

Para criar um trabalho simples que chame um procedimento, use o formato a seguir.

```
{
    "mode": "run_job",
    "parameters": {
        "vendor": "mysql",
        "cmd": "lambda_db.nightly_job"
    }
}
```

Para criar um trabalho com várias etapas, use o formato a seguir.

```
{
    "mode": "run_job",
    "parameters": {
        "job_name": "Job1",
        "enabled": "true",
        "start_step_id": 1,
        "notify_level_email": [0|1|2|3],
        "notify_email": email,
        "delete_level": [0|1|2|3],
        "job_callback": "ProcCallBackJob(job_name, code, message)",
        "step_callback": "ProcCallBackStep(job_name, step_id, code, message)"
    },
    "steps": [
        {
            "id":1,
            "cmd": "ProcStep1",
            "cmdexec_success_code": 0,
            "on_success_action": [|2|3|4],
            "on_success_step_id": 1,
            "on_fail_action": 0,
            "on_fail_step_id": 0,
            "retry_attempts": number,
            "retry_interval": number
        },
        {
            "id":2,
            "cmd": "ProcStep2",
            "cmdexec_success_code": 0,
            "on_success_action": [1|2|3|4],
            "on_success_step_id": 0,
            "on_fail_action": 0,
            "on_fail_step_id": 0,
            "retry_attempts": number,
            "retry_interval": number
        },
        ...
]
}
```

Para emular o comportamento do SQL Server Agent no PostgreSQL, AWS SCT o pacote de extensões também cria as tabelas e os procedimentos a seguir.

## Tabelas que emulam o SQL Server Agent no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Tables"></a>

Para emular o SQL Server Agent, o pacote de extensão usa as seguintes tabelas:

**sysjobs**  
Armazena as informações sobre os trabalhos.

**sysjobsteps**  
Armazena as informações sobre as etapas de um trabalho.

**sysschedules**  
Armazena as informações sobre os cronogramas de trabalho.

**sysjobschedules**  
Armazena as informações de cronograma de trabalhos individuais. 

**sysjobhistory**  
Armazena as informações sobre as execuções de trabalhos programados.

## Procedimentos que emulam o SQL Server Agent no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Procedures"></a>

Para emular o SQL Server Agent, o pacote de extensão usa os seguintes procedimentos:

**sp\$1add\$1job**  
Adiciona um novo trabalho.

**sp\$1add\$1jobstep**  
Adiciona uma etapa a um trabalho.

**sp\$1add\$1schedule**  
Cria uma nova regra de agendamento na Amazon CloudWatch. Você pode usar esse cronograma com qualquer número de trabalhos.

**sp\$1attach\$1schedule**  
Define um cronograma para o trabalho selecionado.

**sp\$1add\$1jobschedule**  
Cria uma regra de agendamento para um trabalho na Amazon CloudWatch e define a meta para essa regra.

**sp\$1update\$1job**  
Atualiza os atributos do trabalho criado anteriormente.

**sp\$1update\$1jobstep**  
Atualiza os atributos da etapa em um trabalho.

**sp\$1update\$1schedule**  
Atualiza os atributos de uma regra de agendamento na Amazon CloudWatch.

**sp\$1update\$1jobschedule**  
Atualiza os atributos do cronograma para o trabalho especificado.

**sp\$1delete\$1job**  
Exclui um trabalho.

**sp\$1delete\$1jobstep**  
Exclui uma etapa do trabalho de um trabalho.

**sp\$1delete\$1schedule**  
Exclui um cronograma.

**sp\$1delete\$1jobschedule**  
Exclui a regra de agendamento para o trabalho especificado da Amazon CloudWatch.

**sp\$1detach\$1schedule**  
Remove uma associação entre um cronograma e um trabalho.

**get\$1jobs, update\$1job**  
Procedimentos internos que interagem com AWS Elastic Beanstalk.

**sp\$1verify\$1job\$1date, sp\$1verify\$1job\$1time, sp\$1verify\$1job, sp\$1verify\$1jobstep, sp\$1verify\$1schedule, sp\$1verify\$1job\$1identifiers, sp\$1verify\$1schedule\$1identifiers**  
Procedimentos internos que verificam as configurações.

## Sintaxe para procedimentos que emulam o SQL Server Agent no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Syntax"></a>

O procedimento `aws_sqlserver_ext.sp_add_job` no pacote de extensão emula o procedimento `msdb.dbo.sp_add_job`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-job-transact-sql?view=sql-server-ver15). 

```
par_job_name varchar,
par_enabled smallint = 1,
par_description varchar = NULL::character varying,
par_start_step_id integer = 1,
par_category_name varchar = NULL::character varying,
par_category_id integer = NULL::integer,
par_owner_login_name varchar = NULL::character varying,
par_notify_level_eventlog integer = 2,
par_notify_level_email integer = 0,
par_notify_level_netsend integer = 0,
par_notify_level_page integer = 0,
par_notify_email_operator_name varchar = NULL::character varying,
par_notify_netsend_operator_name varchar = NULL::character varying,
par_notify_page_operator_name varchar = NULL::character varying,
par_delete_level integer = 0,
inout par_job_id integer = NULL::integer,
par_originating_server varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_add_jobstep` no pacote de extensão emula o procedimento `msdb.dbo.sp_add_jobstep`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobstep-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_step_id integer = NULL::integer,
par_step_name varchar = NULL::character varying,
par_subsystem varchar = 'TSQL'::bpchar,
par_command text = NULL::text,
par_additional_parameters text = NULL::text,
par_cmdexec_success_code integer = 0,
par_on_success_action smallint = 1,
par_on_success_step_id integer = 0,
par_on_fail_action smallint = 2,
par_on_fail_step_id integer = 0,
par_server varchar = NULL::character varying,
par_database_name varchar = NULL::character varying,
par_database_user_name varchar = NULL::character varying,
par_retry_attempts integer = 0,
par_retry_interval integer = 0,
par_os_run_priority integer = 0,
par_output_file_name varchar = NULL::character varying,
par_flags integer = 0,
par_proxy_id integer = NULL::integer,
par_proxy_name varchar = NULL::character varying,
inout par_step_uid char = NULL::bpchar,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_add_schedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_add_schedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-schedule-transact-sql?view=sql-server-ver15). 

```
par_schedule_name varchar,
par_enabled smallint = 1,
par_freq_type integer = 0,
par_freq_interval integer = 0,
par_freq_subday_type integer = 0,
par_freq_subday_interval integer = 0,
par_freq_relative_interval integer = 0,
par_freq_recurrence_factor integer = 0,
par_active_start_date integer = NULL::integer,
par_active_end_date integer = 99991231,
par_active_start_time integer = 0,
par_active_end_time integer = 235959,
par_owner_login_name varchar = NULL::character varying,
*inout par_schedule_uid char = NULL::bpchar,*
inout par_schedule_id integer = NULL::integer,
par_originating_server varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_attach_schedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_attach_schedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-attach-schedule-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_automatic_post smallint = 1,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_add_jobschedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_add_jobschedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobschedule-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_name varchar = NULL::character varying,
par_enabled smallint = 1,
par_freq_type integer = 1,
par_freq_interval integer = 0,
par_freq_subday_type integer = 0,
par_freq_subday_interval integer = 0,
par_freq_relative_interval integer = 0,
par_freq_recurrence_factor integer = 0,
par_active_start_date integer = NULL::integer,
par_active_end_date integer = 99991231,
par_active_start_time integer = 0,
par_active_end_time integer = 235959,
inout par_schedule_id integer = NULL::integer,
par_automatic_post smallint = 1,
inout par_schedule_uid char = NULL::bpchar,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_delete_job` no pacote de extensão emula o procedimento `msdb.dbo.sp_delete_job`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-job-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_originating_server varchar = NULL::character varying,
par_delete_history smallint = 1,
par_delete_unused_schedule smallint = 1,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_delete_jobstep` no pacote de extensão emula o procedimento `msdb.dbo.sp_delete_jobstep`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-jobsteplog-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_step_id integer = NULL::integer,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_delete_jobschedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_delete_jobschedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-jobschedule-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_name varchar = NULL::character varying,
par_keep_schedule integer = 0,
par_automatic_post smallint = 1,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_delete_schedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_delete_schedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-schedule-transact-sql?view=sql-server-ver15). 

```
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_force_delete smallint = 0,
par_automatic_post smallint = 1,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_detach_schedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_detach_schedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-detach-schedule-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_delete_unused_schedule smallint = 0,
par_automatic_post smallint = 1,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_update_job` no pacote de extensão emula o procedimento `msdb.dbo.sp_update_job`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-job-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_description varchar = NULL::character varying
par_start_step_id integer = NULL::integer
par_category_name varchar = NULL::character varying
par_owner_login_name varchar = NULL::character varying
par_notify_level_eventlog integer = NULL::integer
par_notify_level_email integer = NULL::integer
par_notify_level_netsend integer = NULL::integer
par_notify_level_page integer = NULL::integer
par_notify_email_operator_name varchar = NULL::character varying
par_notify_netsend_operator_name varchar = NULL::character varying
par_notify_page_operator_name varchar = NULL::character varying
par_delete_level integer = NULL::integer
par_automatic_post smallint = 1
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_update_jobschedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_update_jobschedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-jobschedule-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_freq_type integer = NULL::integer
par_freq_interval integer = NULL::integer
par_freq_subday_type integer = NULL::integer
par_freq_subday_interval integer = NULL::integer
par_freq_relative_interval integer = NULL::integer
par_freq_recurrence_factor integer = NULL::integer
par_active_start_date integer = NULL::integer
par_active_end_date integer = NULL::integer
par_active_start_time integer = NULL::integer
                par_active_end_time integer = NULL::integer
par_automatic_post smallint = 1
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_update_jobstep` no pacote de extensão emula o procedimento `msdb.dbo.sp_update_jobstep`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-jobstep-transact-sql?view=sql-server-ver15). 

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_step_id integer = NULL::integer
par_step_name varchar = NULL::character varying
par_subsystem varchar = NULL::character varying
par_command text = NULL::text
par_additional_parameters text = NULL::text
par_cmdexec_success_code integer = NULL::integer
par_on_success_action smallint = NULL::smallint
par_on_success_step_id integer = NULL::integer
par_on_fail_action smallint = NULL::smallint
par_on_fail_step_id integer = NULL::integer
par_server varchar = NULL::character varying
par_database_name varchar = NULL::character varying
par_database_user_name varchar = NULL::character varying
par_retry_attempts integer = NULL::integer
par_retry_interval integer = NULL::integer
par_os_run_priority integer = NULL::integer
par_output_file_name varchar = NULL::character varying
par_flags integer = NULL::integer
par_proxy_id integer = NULL::integer
par_proxy_name varchar = NULL::character varying
out returncode integer
```

O procedimento `aws_sqlserver_ext.sp_update_schedule` no pacote de extensão emula o procedimento `msdb.dbo.sp_update_schedule`. Para obter mais informações sobre o procedimento do SQL Server Agent de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-schedule-transact-sql?view=sql-server-ver15). 

```
par_schedule_id integer = NULL::integer
par_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_freq_type integer = NULL::integer
par_freq_interval integer = NULL::integer
par_freq_subday_type integer = NULL::integer
par_freq_subday_interval integer = NULL::integer
par_freq_relative_interval integer = NULL::integer
par_freq_recurrence_factor integer = NULL::integer
par_active_start_date integer = NULL::integer
par_active_end_date integer = NULL::integer
par_active_start_time integer = NULL::integer
par_active_end_time integer = NULL::integer
par_owner_login_name varchar = NULL::character varying
par_automatic_post smallint = 1
out returncode integer
```

## Exemplos de uso de procedimentos que emulam o SQL Server Agent no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Examples"></a>

Para adicionar um novo trabalho, use o procedimento `aws_sqlserver_ext.sp_add_job` conforme mostrado a seguir.

```
SELECT * FROM aws_sqlserver_ext.sp_add_job (
    par_job_name := 'test_job',
    par_enabled := 1::smallint,
    par_start_step_id := 1::integer,
    par_category_name := '[Uncategorized (Local)]',
    par_owner_login_name := 'sa');
```

Para adicionar uma nova etapa do trabalho, use o procedimento `aws_sqlserver_ext.sp_add_jobstep` conforme mostrado a seguir.

```
SELECT * FROM aws_sqlserver_ext.sp_add_jobstep (
    par_job_name := 'test_job',
    par_step_id := 1::smallint,
    par_step_name := 'test_job_step1',
    par_subsystem := 'TSQL',
    par_command := 'EXECUTE [dbo].[PROC_TEST_JOB_STEP1];',
    par_server := NULL,
    par_database_name := 'GOLD_TEST_SS');
```

Para adicionar um cronograma simples, use o procedimento `aws_sqlserver_ext.sp_add_schedule` conforme mostrado a seguir.

```
SELECT * FROM aws_sqlserver_ext.sp_add_schedule(
    par_schedule_name := 'RunOnce',
    par_freq_type := 1,
    par_active_start_time := 233000);
```

Para definir um cronograma para um trabalho, use o procedimento `aws_sqlserver_ext.sp_attach_schedule` conforme mostrado a seguir.

```
SELECT * FROM aws_sqlserver_ext.sp_attach_schedule (
    par_job_name := 'test_job',
    par_schedule_name := 'NightlyJobs');
```

Para criar um cronograma para um trabalho, use o procedimento `aws_sqlserver_ext.sp_add_jobschedule` conforme mostrado a seguir.

```
SELECT * FROM aws_sqlserver_ext.sp_add_jobschedule (
    par_job_name := 'test_job2',
    par_name := 'test_schedule2',
    par_enabled := 1::smallint,
    par_freq_type := 4,
    par_freq_interval := 1,
    par_freq_subday_type := 4,
    par_freq_subday_interval := 1,
    par_freq_relative_interval := 0,
    par_freq_recurrence_factor := 0,
    par_active_start_date := 20100801,
    par_active_end_date := 99991231,
    par_active_start_time := 0,
    par_active_end_time := 0);
```

## Use exemplos de casos para emular o SQL Server Agent no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.UseCases"></a>

Se o código-fonte do banco de dados usa o SQL Server Agent para executar trabalhos, você pode usar o pacote de extensão SQL Server para PostgreSQL AWS SCT para converter esse código em PostgreSQL. O pacote de extensão usa AWS Lambda funções para emular o comportamento do SQL Server Agent.

Você pode criar uma nova AWS Lambda função ou registrar uma função existente.

**Para criar uma nova AWS Lambda função**

1. Em AWS SCT, na árvore do banco de dados de destino, abra o menu de contexto (clique com o botão direito do mouse), escolha **Aplicar pacote de extensão para** e, em seguida, escolha **PostgreSQL**. 

   O assistente do pacote de extensões é exibido. 

1. Na guia **Serviço de emulação do SQL Server Agent**, faça o seguinte: 
   + Escolha **Criar uma AWS Lambda função**.
   + Em **Login do banco de dados**, insira o nome do usuário do banco de dados de destino.
   + Em **Senha do banco de dados**, insira a senha do nome de usuário que você inseriu na etapa anterior.
   + Para a **pasta da biblioteca Python**, insira o caminho para a pasta da biblioteca Python.
   + Escolha **Criar AWS Lambda função** e, em seguida, escolha **Avançar**.

**Para registrar uma AWS Lambda função que você implantou anteriormente**
+ Execute o script a seguir no banco de dados de destino.

  ```
  SELECT
      FROM aws_sqlserver_ext.set_service_setting(
          p_service := 'JOB', 
          p_setting := 'LAMBDA_ARN', 
          p_value := ARN)
  ```

  No exemplo anterior, *`ARN`* é o nome do recurso da Amazon (ARN) da função AWS Lambda implantada.

O exemplo a seguir cria uma tarefa simples que consiste em uma etapa. A cada cinco minutos, essa tarefa executa a função `job_example` criada anteriormente. Essa função insere registros na tabela `job_example_table`.

**Para criar essa tarefa simples**

1. Crie um trabalho usando a função `aws_sqlserver_ext.sp_add_job`, conforme mostrado a seguir.

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_job (
           par_job_name := 'test_simple_job');
   ```

1. Crie uma etapa de trabalho usando a função `aws_sqlserver_ext.sp_add_jobstep`, conforme mostrado a seguir.

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_jobstep (
           par_job_name := 'test_simple_job', 
           par_step_name := 'test_simple_job_step1', 
           par_command := 'PERFORM job_simple_example;');
   ```

   A etapa do trabalho especifica o que a função faz.

1. Crie um programador para o trabalho usando a função `aws_sqlserver_ext.sp_add_jobschedule`, conforme mostrado a seguir.

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_jobschedule (
           par_job_name := 'test_simple_job', 
           par_name := 'test_schedule', 
           par_freq_type := 4, /* Daily */
           par_freq_interval := 1, /* frequency_interval is unused */
           par_freq_subday_type := 4, /* Minutes */
           par_freq_subday_interval := 5 /* 5 minutes */);
   ```

   A etapa do trabalho especifica o que a função faz.

Para excluir esse trabalho, use a função `aws_sqlserver_ext.sp_delete_job` conforme mostrado a seguir.

```
PERFORM aws_sqlserver_ext.sp_delete_job(
    par_job_name := 'PeriodicJob1'::character varying,
    par_delete_history := 1::smallint,
    par_delete_unused_schedule := 1::smallint);
```

# Usando um pacote AWS SCT de extensão para emular o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail"></a>

Você pode usar o SQL Server Database Mail para enviar mensagens de e-mail aos usuários a partir do mecanismo de banco de dados do SQL Server ou da instância gerenciada do Azure SQL. Essas mensagens de e-mail podem conter resultados de consultas ou incluir arquivos de qualquer recurso em sua rede. Para obter mais informações sobre o SQL Server Database Mail, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail?view=sql-server-ver15).

O PostgreSQL não tem um equivalente para o SQL Server Database Mail. Para emular os atributos do SQL Server Database Mail, a AWS SCT cria um pacote de extensão. Esse pacote de extensão usa AWS Lambda o Amazon Simple Email Service (Amazon SES). AWS Lambda fornece aos usuários uma interface para interagir com o serviço de envio de e-mail do Amazon SES. Para configurar essa interação, adicione o nome do recurso da Amazon (ARN) da sua função do Lambda. 

Para uma nova conta de e-mail, use o comando a seguir.

```
do
$$
begin
PERFORM sysmail_add_account_sp (
    par_account_name :='your_account_name',
    par_email_address := 'your_account_email',
    par_display_name := 'your_account_display_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

Para adicionar o ARN da sua função do Lambda à conta de e-mail existente, use o comando a seguir.

```
do
$$
begin
PERFORM sysmail_update_account_sp (
    par_account_name :='existind_account_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

Nos exemplos anteriores, *`ARN`* é o ARN da sua função do Lambda.

Para emular o comportamento do SQL Server Database Mail no PostgreSQL, o pacote de extensão da AWS SCT usa as seguintes tabelas, visualizações e procedimentos.

## Tabelas que emulam o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Tables"></a>

Para emular o SQL Server Database Mail, o pacote de extensão usa as seguintes tabelas:

**sysmail\$1account**  
Armazena as informações sobre as contas de e-mail.

**sysmail\$1profile**  
Armazena as informações sobre os perfis de usuário.

**sysmail\$1server**  
Armazena as informações sobre os servidores de e-mail.

**sysmail\$1mailitems**  
Armazena a lista das mensagens de e-mail.

**sysmail\$1attachments**  
Contém uma linha para cada anexo de e-mail.

**sysmail\$1log**  
Armazena as informações do serviço sobre o envio de mensagens de e-mail.

**sysmail\$1profileaccount**  
Armazena as informações sobre os perfis de usuário e contas de e-mail.

## Visualizações que emulam o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Views"></a>

Para emular o SQL Server Database Mail, AWS SCT cria as seguintes visualizações no banco de dados PostgreSQL para garantir a compatibilidade. O pacote de extensão não as usa, mas seu código convertido pode consultar essas visualizações.

**sysmail\$1allitems**  
Inclui uma lista de todos os e-mails.

**sysmail\$1faileditems**  
Inclui uma lista de e-mails que não puderam ser enviados.

**sysmail\$1sentitems**  
Inclui uma lista de e-mails enviados.

**sysmail\$1unsentitems**  
Inclui uma lista de e-mails que ainda não foram enviados.

**sysmail\$1mailattachments**  
Inclui uma lista de arquivos anexados.

## Procedimentos que emulam o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Procedures"></a>

Para emular o SQL Server Database Mail, o pacote de extensão usa os seguintes procedimentos:

**sp\$1send\$1dbmail**  
Envia um e-mail para os destinatários especificados.

**sysmail\$1add\$1profile\$1sp**  
Cria um novo perfil de usuário.

**sysmail\$1add\$1account\$1sp**  
Cria uma nova conta de e-mail que armazena informações como credenciais do Simple Mail Transfer Protocol (SMTP) e assim por diante.

**sysmail\$1add\$1profileaccount\$1sp**  
Adiciona uma conta de e-mail ao perfil de usuário especificado.

**sysmail\$1update\$1profile\$1sp**  
Altera os atributos do perfil do usuário, como descrição, nome e assim por diante.

**sysmail\$1update\$1account\$1sp**  
Altera as informações na conta de e-mail existente.

**sysmail\$1update\$1profileaccount\$1sp**  
Atualiza as informações da conta de e-mail no perfil de usuário especificado.

**sysmail\$1delete\$1profileaccount\$1sp**  
Remove uma conta de e-mail do perfil de usuário especificado.

**sysmail\$1delete\$1account\$1sp**  
Exclui a conta de e-mail.

**sysmail\$1delete\$1profile\$1sp**  
Exclui o perfil de usuário.

**sysmail\$1delete\$1mailitems\$1sp**  
Exclui e-mails de tabelas internas.

**sysmail\$1help\$1profile\$1sp**  
Exibe informações sobre o perfil do usuário.

**sysmail\$1help\$1account\$1sp**  
Exibe informações sobre a conta de e-mail.

**sysmail\$1help\$1profileaccount\$1sp**  
Exibe informações sobre contas de e-mail associadas ao perfil de usuário.

**sysmail\$1dbmail\$1json**  
Um procedimento interno que gera solicitações JSON para AWS Lambda funções.

**sysmail\$1verify\$1profile\$1sp, sysmail\$1verify\$1account\$1sp, sysmail\$1verify\$1addressparams\$1sp**  
Procedimentos internos que verificam as configurações.

**sp\$1get\$1dbmail, sp\$1set\$1dbmail, sysmail\$1dbmail\$1xml**  
Procedimentos internos obsoletos.

## Sintaxe para procedimentos que emulam o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Syntax"></a>

O procedimento `aws_sqlserver_ext.sp_send_dbmail` no pacote de extensão emula o procedimento `msdb.dbo.sp_send_dbmail`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-ver15).

```
par_profile_name varchar = NULL::character varying,
par_recipients text = NULL::text,
par_copy_recipients text = NULL::text,
par_blind_copy_recipients text = NULL::text,
par_subject varchar = NULL::character varying,
par_body text = NULL::text,
par_body_format varchar = NULL::character varying,
par_importance varchar = 'NORMAL'::character varying,
par_sensitivity varchar = 'NORMAL'::character varying,
par_file_attachments text = NULL::text,
par_query text = NULL::text,
par_execute_query_database varchar = NULL::character varying,
par_attach_query_result_as_file smallint = 0,
par_query_attachment_filename varchar = NULL::character varying,
par_query_result_header smallint = 1,
par_query_result_width integer = 256,
par_query_result_separator VARCHAR = ' '::character varying,
par_exclude_query_output smallint = 0,
par_append_query_error smallint = 0,
par_query_no_truncate smallint = 0,
par_query_result_no_padding smallint = 0,
out par_mailitem_id integer,
par_from_address text = NULL::text,
par_reply_to text = NULL::text,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_delete_mailitems_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_delete_mailitems_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-mailitems-sp-transact-sql?view=sql-server-ver15).

```
par_sent_before timestamp = NULL::timestamp without time zone,
par_sent_status varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_add_profile_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_add_profile_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profile-sp-transact-sql?view=sql-server-ver15).

```
par_profile_name varchar,
par_description varchar = NULL::character varying,
out par_profile_id integer,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_add_account_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_add_account_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-account-sp-transact-sql?view=sql-server-ver15).

```
par_account_name varchar
par_email_address varchar
par_display_name varchar = NULL::character varying
par_replyto_address varchar = NULL::character varying
par_description varchar = NULL::character varying
par_mailserver_name varchar = NULL::character varying
par_mailserver_type varchar = 'SMTP'::bpchar
par_port integer = 25
par_username varchar = NULL::character varying
par_password varchar = NULL::character varying
par_use_default_credentials smallint = 0
par_enable_ssl smallint = 0
out par_account_id integer
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_add_profileaccount_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_add_profileaccount_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profileaccount-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_help_profile_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_help_profile_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-profile-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_update_profile_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_update_profile_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-profile-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_description varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_delete_profile_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_delete_profile_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-profile-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_force_delete smallint = 1,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_help_account_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_help_account_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-account-sp-transact-sql?view=sql-server-ver15).

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_update_account_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_update_account_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-account-sp-transact-sql?view=sql-server-ver15).

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_email_address varchar = NULL::character varying,
par_display_name varchar = NULL::character varying,
par_replyto_address varchar = NULL::character varying,
par_description varchar = NULL::character varying,
par_mailserver_name varchar = NULL::character varying,
par_mailserver_type varchar = NULL::character varying,
par_port integer = NULL::integer,
par_username varchar = NULL::character varying,
par_password varchar = NULL::character varying,
par_use_default_credentials smallint = NULL::smallint,
par_enable_ssl smallint = NULL::smallint,
par_timeout integer = NULL::integer,
par_no_credential_change smallint = NULL::smallint,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_delete_account_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_delete_account_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-account-sp-transact-sql?view=sql-server-ver15).

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_help_profileaccount_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_help_profileaccount_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-profileaccount-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_update_profileaccount_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_update_profileaccount_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-profileaccount-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

O procedimento `aws_sqlserver_ext.sysmail_delete_profileaccount_sp` no pacote de extensão emula o procedimento `msdb.dbo.sysmail_delete_profileaccount_sp`. Para obter mais informações sobre o procedimento do SQL Server Database Mail de origem, consulte a [documentação técnica da Microsoft](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-profileaccount-sp-transact-sql?view=sql-server-ver15).

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

## Exemplos de uso de procedimentos que emulam o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Examples"></a>

Para enviar um e-mail, use o procedimento `aws_sqlserver_ext.sp_send_dbmail` conforme mostrado a seguir.

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Automated Success Message',
    par_body := 'The stored procedure finished'
);
```

O exemplo a seguir mostra como enviar um e-mail com resultados da consulta.

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Account with id = 1',
    par_query := 'SELECT COUNT(*)FROM Account WHERE id = 1'
);
```

O exemplo a seguir mostra como enviar e-mails brutos com código HTML.

```
DECLARE var_tableHTML TEXT;
SET var_tableHTML := CONCAT(
    '<H1>Work Order Report</H1>',
    '<table border="1">',
    '<tr><th>Work Order ID</th><th>Product ID</th>',
    '<th>Name</th><th>Order Qty</th><th>Due Date</th>',
    '<th>Expected Revenue</th></tr>',
    '</table>'
);
PERFORM sp_send_dbmail (
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Work Order List',
    par_body := var_tableHTML,
    par_body_format := 'HTML'
);
```

Para excluir e-mails, use o procedimento `aws_sqlserver_ext.sysmail_delete_mailitems_sp` conforme mostrado a seguir.

```
DECLARE var_GETDATE datetime;
SET var_GETDATE = NOW();
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := var_GETDATE
);
```

O exemplo a seguir mostra como excluir os e-mails mais antigos.

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := '31.12.2015'
);
```

O exemplo a seguir mostra como excluir todos os e-mails que não podem ser enviados.

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_status := 'failed'
);
```

Para criar um novo perfil de usuário, use o procedimento `aws_sqlserver_ext.sysmail_add_profile_sp` conforme mostrado a seguir.

```
PERFORM sysmail_add_profile_sp (
    profile_name := 'Administrator',
    par_description := 'administrative mail'
);
```

O exemplo a seguir mostra como criar um novo perfil e salvar o identificador de perfil exclusivo em uma variável.

```
DECLARE var_profileId INT;
SELECT par_profile_id
    FROM sysmail_add_profile_sp (
        profile_name := 'Administrator',
        par_description := ' Profile used for administrative mail.')
    INTO var_profileId;
    
SELECT var_profileId;
```

Para criar uma nova conta de e-mail, use o procedimento `aws_sqlserver_ext.sysmail_add_account_sp` conforme mostrado a seguir.

```
PERFORM sysmail_add_account_sp (
    par_account_name :='Audit Account',
    par_email_address := 'dba@rusgl.info',
    par_display_name := 'Test Automated Mailer',
    par_description := 'Account for administrative e-mail.',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'arn:aws:lambda:us-west-2:555555555555:function:pg_v3'
);
```

Para adicionar uma conta de e-mail ao perfil do usuário, use o procedimento `aws_sqlserver_ext.sysmail_add_profileaccount_sp` conforme mostrado a seguir.

```
PERFORM sysmail_add_profileaccount_sp (
    par_account_name := 'Administrator',
    par_account_name := 'Audit Account',
    par_sequence_number := 1
);
```

## Use exemplos de casos para emular o SQL Server Database Mail no PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.UseCases"></a>

Se o código-fonte do banco de dados usa o SQL Server Database Mail para enviar e-mails, você pode usar o pacote de AWS SCT extensão para converter esse código em PostgreSQL.

**Para enviar um e-mail do seu banco de dados PostgreSQL**

1. Crie e configure sua AWS Lambda função.

1. Aplique o pacote AWS SCT de extensão.

1. Crie um perfil de usuário usando a função `sysmail_add_profile_sp` conforme mostrado a seguir.

1. Crie uma conta de e-mail usando a função `sysmail_add_account_sp` conforme mostrado a seguir.

1. Adicione essa conta de e-mail ao seu perfil de usuário usando a função `sysmail_add_profileaccount_sp` mostrada a seguir.

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_settings_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sysmail_add_profile_sp(
       par_profile_name := 'Administrator',
       par_description := 'administrative mail'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_account_sp(
       par_account_name := 'Audit Account',
       par_description := 'Account for administrative e-mail.',
       par_email_address := 'dba@rusgl.info',
       par_display_name := 'Test Automated Mailer',
       par_mailserver_type := 'AWSLAMBDA'
       par_mailserver_name := 'your_ARN'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_profileaccount_sp(
       par_profile_name := 'Administrator',
       par_account_name := 'Audit Account',
       par_sequence_number := 1
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

1. Envie um e-mail usando a função `sp_send_dbmail`, conforme mostrado a seguir.

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_send_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sp_send_dbmail(
       par_profile_name := 'Administrator',
       par_recipients := 'hello@rusgl.info',
       par_body := 'The stored procedure finished',
       par_subject := 'Automated Success Message'
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

Para ver as informações sobre todos os perfis de usuário, use o procedimento `sysmail_help_profile_sp` conforme mostrado a seguir.

```
SELECT FROM aws_sqlserver_ext.sysmail_help_profile_sp();
```

O exemplo a seguir exibe as informações sobre o perfil de usuário específico.

```
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_name := 'Administrator');
```

Para visualizar as informações sobre todas as contas de e-mail, use o procedimento `sysmail_help_account_sp` conforme mostrado a seguir.

```
select from aws_sqlserver_ext.sysmail_help_account_sp();
```

O exemplo a seguir exibe as informações sobre a conta de e-mail específica.

```
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_name := 'Audit Account');
```

Para visualizar as informações sobre todas as contas de e-mail que estão associadas com os perfis de usuário, use o procedimento `sysmail_help_profileaccount_sp` conforme mostrado a seguir.

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp();
```

O exemplo a seguir filtra os registros por identificador, nome do perfil ou nome da conta.

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1, par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_name := 'Administrator');
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_account_name := 'Audit Account');
```

Para alterar o nome ou a descrição do perfil do usuário, use o procedimento `sysmail_update_profile_sp` conforme mostrado a seguir.

```
select aws_sqlserver_ext.sysmail_update_profile_sp(
    par_profile_id := 2,
    par_profile_name := 'New profile name'
);
```

Para alterar as configurações da conta de e-mail, use o procedimento `ysmail_update_account_sp` conforme mostrado a seguir.

```
select from aws_sqlserver_ext.sysmail_update_account_sp (
    par_account_name := 'Audit Account',
    par_mailserver_name := 'arn:aws:lambda:region:XXXXXXXXXXXX:function:func_test',
    par_mailserver_type := 'AWSLAMBDA'
);
```

# Migração do SQL Server para o Amazon RDS for SQL Server com AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToRDSSQLServer"></a>

Há alguns aspectos a serem considerados ao migrar o esquema e o código do SQL Server para o Amazon RDS for SQL Server: 
+ AWS SCT pode converter o SQL Server Agent para fornecer agendas, alertas e trabalhos em uma instância de banco de dados Amazon RDS for SQL Server. Após a conversão, é possível usar uma instância de banco de dados do Amazon RDS for SQL Server com o SQL Server Reporting Service (SSRS), o SQL Server Analysis Services (SSAS) e o SQL Server Integration Services (SSIS).
+ Atualmente, o Amazon RDS não é compatível com o SQL Server Service Broker nem outros endpoints do T-SQL que exijam a execução do comando CREATE ENDPOINT.
+ O Amazon RDS tem suporte limitado para servidores vinculados. Ao converter o código do aplicativo SQL Server que usa servidores vinculados, AWS SCT converte o código do aplicativo. No entanto, certifique-se de revisar o comportamento de objetos que usam servidores vinculados antes de executar o código convertido.
+ Sempre ativo é usado.
+ O relatório de AWS SCT avaliação fornece métricas do servidor para a conversão. Essas métricas sobre sua instância do SQL Server incluem:
  + O espelhamento de dados é usado.
  + O envio de logs do SQL Server é configurado.
  + O cluster de failover é usado.
  + O e-mail do banco de dados é configurado. 
  + O serviço Full Text Search é usado. O Amazon RDS for SQL Server tem um Full Text Search limitado. Além disso, ele não oferece suporte à pesquisa semântica.
  + O Data Quality Service (DQS) está instalado. O Amazon RDS não oferece suporte ao DQS. Portanto, recomendamos que você instale o SQL Server em uma instância do Amazon EC2.

## Privilégios do RDS para SQL Server como destino
<a name="CHAP_Source.SQLServer.ToRDSSQLServer.ConfigureTarget"></a>

Para migrar para o RDS para SQL Server, crie um usuário de banco de dados e, em seguida, conceda os privilégios necessários para cada banco de dados. Você pode usar o exemplo de código a seguir.

```
CREATE LOGIN user_name WITH PASSWORD 'your_password';
                
USE db_name
CREATE USER user_name FOR LOGIN user_name
GRANT VIEW DEFINITION TO user_name
GRANT VIEW DATABASE STATE TO user_name
GRANT CREATE SCHEMA TO user_name;
GRANT CREATE TABLE TO user_name;
GRANT CREATE VIEW TO user_name;
GRANT CREATE TYPE TO user_name;
GRANT CREATE DEFAULT TO user_name;
GRANT CREATE FUNCTION TO user_name;
GRANT CREATE PROCEDURE TO user_name;
GRANT CREATE ASSEMBLY TO user_name;
GRANT CREATE AGGREGATE TO user_name;
GRANT CREATE FULLTEXT CATALOG TO user_name;
GRANT CREATE SYNONYM TO user_name;
GRANT CREATE XML SCHEMA COLLECTION TO user_name;
```

No exemplo anterior, *user\$1name* substitua pelo nome do seu usuário. Em seguida, *db\$1name* substitua pelo nome do seu banco de dados de destino. Por fim, *your\$1password* substitua por uma senha segura.