Usando um pacote de extensão da AWS SCT para emular o SQL Server Agent no PostgreSQL
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
O PostgreSQL não tem um equivalente para SQL Server Agent. Para emular os recursos do SQL Server Agent, a AWS SCT cria um pacote de extensão. Este pacote de extensão usa o AWS Lambda e o Amazon CloudWatch. O AWS Lambda implementa a interface que você usa para gerenciar agendamentos e executar trabalhos. O Amazon CloudWatch mantém as regras de programação.
O AWS Lambda e o 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, é o tipo da tarefa e mode é um conjunto de parâmetros que dependem do tipo da tarefa. Além disso, list of parameters é o nome do procedimento executado após a conclusão da tarefa.procedure name
A AWS SCT usa uma função do Lambda para controlar e executar trabalhos. A regra do CloudWatch inicia a execução do trabalho e fornece as informações necessárias para iniciar o trabalho. Quando a regra do CloudWatch é acionada, ela inicia a função do 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, o pacote de extensão da AWS SCT também cria as tabelas e os procedimentos a seguir.
Tabelas que emulam o SQL Server Agent no PostgreSQL
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
Para emular o SQL Server Agent, o pacote de extensão usa os seguintes procedimentos:
- sp_add_job
Adiciona um novo trabalho.
- sp_add_jobstep
Adiciona uma etapa a um trabalho.
- sp_add_schedule
Cria uma nova regra de cronograma no Amazon CloudWatch. Você pode usar esse cronograma com qualquer número de trabalhos.
- sp_attach_schedule
Define um cronograma para o trabalho selecionado.
- sp_add_jobschedule
Cria uma regra de cronograma para um trabalho no Amazon CloudWatch e define o destino para essa regra.
- sp_update_job
Atualiza os atributos do trabalho criado anteriormente.
- sp_update_jobstep
Atualiza os atributos da etapa em um trabalho.
- sp_update_schedule
Atualiza os atributos de uma regra de cronograma no Amazon CloudWatch.
- sp_update_jobschedule
Atualiza os atributos do cronograma para o trabalho especificado.
- sp_delete_job
Exclui um trabalho.
- sp_delete_jobstep
Exclui uma etapa do trabalho de um trabalho.
- sp_delete_schedule
Exclui um cronograma.
- sp_delete_jobschedule
Exclui a regra de cronograma para o trabalho especificado do Amazon CloudWatch.
- sp_detach_schedule
Remove uma associação entre um cronograma e um trabalho.
- get_jobs, update_job
Procedimentos internos que interagem com AWS Elastic Beanstalk.
- sp_verify_job_date, sp_verify_job_time, sp_verify_job, sp_verify_jobstep, sp_verify_schedule, sp_verify_job_identifiers, sp_verify_schedule_identifiers
Procedimentos internos que verificam as configurações.
Sintaxe para procedimentos que emulam o SQL Server Agent no PostgreSQL
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Se o código do banco de dados de origem usa o SQL Server Agent para executar trabalhos, você pode usar o pacote de extensão SQL Server para PostgreSQL para AWS SCT para converter esse código em PostgreSQL. O pacote de extensão usa funções AWS Lambda para emular o comportamento do SQL Server Agent.
Você pode criar uma nova função AWS Lambda ou registrar uma função existente.
Para criar uma nova função do AWS Lambda
-
Na 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.
-
Na guia Serviço de emulação do SQL Server Agent, faça o seguinte:
-
Escolha Criar uma função AWS Lambda.
-
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 uma função AWS Lambda e, em seguida, escolha Avançar.
-
Para registrar uma função AWS Lambda 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,
é o nome do recurso da Amazon (ARN) da função AWS Lambda implantada.ARN
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
-
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'); -
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.
-
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);