使用 AWS SCT 扩展包在 PostgreSQL 中模拟 SQL Server Agent
SQL Server Agent 是运行 SQL Server 作业的 Microsoft Windows 服务。SQL Server Agent 可以根据计划、为响应特定事件或者按需运行作业。有关 SQL Server Agent 的详细信息,请参阅 Microsoft 技术文档
PostgreSQL 没有 SQL Server Agent 的等效服务。要模拟 SQL Server Agent 功能,AWS SCT 会创建一个扩展包。此扩展包使用 AWS Lambda 和 Amazon CloudWatch。AWS Lambda 实现用于管理计划和运行作业的接口。Amazon CloudWatch 维护计划规则。
AWS Lambda 和 Amazon CloudWatch 使用 JSON 参数进行交互。此 JSON 参数具有以下结构。
{ "mode":
mode
, "parameters": {list of parameters
}, "callback":procedure name
}
在前面的示例中,
是任务的类型,mode
是一组取决于任务类型的参数。此外,list of parameters
是任务完成后运行的过程的名称。procedure name
AWS SCT 使用一个 Lambda 函数控制和运行作业。CloudWatch 规则开始运行作业,并提供启动任务所需的必要信息。当 CloudWatch 规则触发时,它会使用规则中的参数启动 Lambda 函数。
要创建调用过程的简单作业,请使用以下格式。
{ "mode": "run_job", "parameters": { "vendor": "mysql", "cmd": "lambda_db.nightly_job" } }
要创建多个步骤作业,请使用以下格式。
{ "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 }, ... ] }
为了在 PostgreSQL 中模拟 SQL Server Agent 行为,AWS SCT 扩展包还会创建了以下表格和过程。
在 PostgreSQL 中模拟 SQL Server Agent 的表
为了模拟 SQL Server Agent,扩展包使用以下表:
- sysjobs
存储有关作业的信息。
- sysjobsteps
存储有关作业步骤的信息。
- sysschedules
存储有关作业计划的信息。
- sysjobschedules
存储各个作业的计划信息。
- sysjobhistory
存储有关计划作业运行的信息。
在 PostgreSQL 中模拟 SQL Server Agent 的过程
要模拟 SQL Server Agent,扩展包使用以下过程:
- sp_add_job
添加新作业。
- sp_add_jobstep
向作业添加步骤。
- sp_add_schedule
在 Amazon CloudWatch 中创建新的计划规则。您可以将此计划用于任意数量的作业。
- sp_attach_schedule
设置所选作业的计划。
- sp_add_jobschedule
在 Amazon CloudWatch 中为作业创建计划规则并为该规则设定目标。
- sp_update_job
更新先前创建的作业的属性。
- sp_update_jobstep
更新作业中步骤的属性。
- sp_update_schedule
更新 Amazon CloudWatch 中计划规则的属性。
- sp_update_jobschedule
更新指定作业计划的属性。
- sp_delete_job
删除作业。
- sp_delete_jobstep
从作业中删除一个作业步骤。
- sp_delete_schedule
删除计划。
- sp_delete_jobschedule
从 Amazon CloudWatch 中删除指定作业的计划规则。
- sp_detach_schedule
移除计划和作业之间的关联。
- get_jobs、update_job
与 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
检查设置的内部过程。
在 PostgreSQL 中模拟 SQL Server Agent 的过程的语法
扩展包中的 aws_sqlserver_ext.sp_add_job
过程模拟 msdb.dbo.sp_add_job
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_add_jobstep
过程模拟 msdb.dbo.sp_add_jobstep
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_add_schedule
过程模拟 msdb.dbo.sp_add_schedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_attach_schedule
过程模拟 msdb.dbo.sp_attach_schedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_add_jobschedule
过程模拟 msdb.dbo.sp_add_jobschedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_delete_job
过程模拟 msdb.dbo.sp_delete_job
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_delete_jobstep
过程模拟 msdb.dbo.sp_delete_jobstep
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 Microsoft 技术文档
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_step_id integer = NULL::integer, out returncode integer
扩展包中的 aws_sqlserver_ext.sp_delete_jobschedule
过程模拟 msdb.dbo.sp_delete_jobschedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_delete_schedule
过程模拟 msdb.dbo.sp_delete_schedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_detach_schedule
过程模拟 msdb.dbo.sp_detach_schedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_update_job
过程模拟 msdb.dbo.sp_update_job
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_update_jobschedule
过程模拟 msdb.dbo.sp_update_jobschedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_update_jobstep
过程模拟 msdb.dbo.sp_update_jobstep
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
扩展包中的 aws_sqlserver_ext.sp_update_schedule
过程模拟 msdb.dbo.sp_update_schedule
过程。有关源 SQL Server Agent 过程的详细信息,请参阅 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
使用在 PostgreSQL 中模拟 SQL Server Agent 的过程的示例
要添加新作业,请使用如下所示的 aws_sqlserver_ext.sp_add_job
过程。
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');
要添加新的作业步骤,请使用如下所示的 aws_sqlserver_ext.sp_add_jobstep
过程。
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');
要添加简单的计划,请使用如下所示的 aws_sqlserver_ext.sp_add_schedule
过程。
SELECT * FROM aws_sqlserver_ext.sp_add_schedule( par_schedule_name := 'RunOnce', par_freq_type := 1, par_active_start_time := 233000);
要为作业设置计划,请使用如下所示的 aws_sqlserver_ext.sp_attach_schedule
过程。
SELECT * FROM aws_sqlserver_ext.sp_attach_schedule ( par_job_name := 'test_job', par_schedule_name := 'NightlyJobs');
要为作业创建计划,请使用如下所示的 aws_sqlserver_ext.sp_add_jobschedule
过程。
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);
在 PostgreSQL 中模拟 SQL Server Agent 的使用案例示例
如果源数据库代码使用 SQL Server Agent 运行作业,则可以使用 AWS SCT 的 SQL Server 到 PostgreSQL 扩展包将此代码转换为 PostgreSQL。扩展包使用 AWS Lambda 函数模拟 SQL Server Agent 的行为。
您可以创建新的 AWS Lambda 函数或注册现有函数。
创建新 AWS Lambda 函数
-
在 AWS SCT 的目标数据库树中,打开上下文(右键单击)菜单,然后选择应用扩展包,然后选择 PostgreSQL。
扩展包向导随即出现。
-
在 SQL Server Agent 模拟服务选项卡上,执行以下操作:
-
选择创建 AWS Lambda 函数。
-
在数据库登录名中,输入目标数据库用户名。
-
在数据库密码中,输入您在上一步中输入的用户名的密码。
-
对于 Python 库文件夹,请输入 Python 库文件夹的路径。
-
选择创建 AWS Lambda 函数,然后选择下一步。
-
注册之前部署的 AWS Lambda 函数
-
在目标数据库上运行以下脚本。
SELECT FROM aws_sqlserver_ext.set_service_setting( p_service := 'JOB', p_setting := 'LAMBDA_ARN', p_value :=
ARN
)在上述示例中,
是已部署 AWS Lambda 函数的 Amazon 资源名称(ARN)。ARN
以下示例创建了一个由一个步骤组成的简单任务。此任务每五分钟运行一次先前创建的 job_example
函数。此函数将记录插入 job_example_table
表中。
创建这个简单的任务
-
使用
aws_sqlserver_ext.sp_add_job
函数创建作业,如下所示。SELECT FROM aws_sqlserver_ext.sp_add_job ( par_job_name := 'test_simple_job');
-
使用
aws_sqlserver_ext.sp_add_jobstep
函数创建任务步骤,如下所示。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;');
作业步骤指定函数的用途。
-
使用
aws_sqlserver_ext.sp_add_jobschedule
函数为作业创建计划程序,如下所示。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 */);
作业步骤指定函数的用途。
要删除此作业,请使用如下所示的 aws_sqlserver_ext.sp_delete_job
函数。
PERFORM aws_sqlserver_ext.sp_delete_job( par_job_name := 'PeriodicJob1'::character varying, par_delete_history := 1::smallint, par_delete_unused_schedule := 1::smallint);