为了在逻辑应用程序上运行相当长的 SQL 查询,我将其保存为数据库中的存储过程,然后创建作业和步骤来运行存储过程以及作业的所有者和目标组。我在为让我的作业正常运行而创建的弹性作业代理上看到了我的作业、凭据和目标组。
当我直接在数据库上运行查询时,它运行成功,大约需要 28 分钟。
我在我的逻辑应用上运行该作业。这意味着我不直接运行查询,而是创建将存储过程作为一个步骤运行的作业。
但是当我在 Elastic Job Agent 中查看结果时,我注意到它立即超时。该查询似乎没有执行。我知道这一点,因为在查询开始时我清空了一个表,但没有看到这种情况发生。
我这样做的原因是因为逻辑应用程序对于冗长的 SQL 查询存在超时问题。但现在我在 Elastic Job Agent 上遇到超时,甚至比逻辑应用程序的 2 分钟限制还要快。
更新:
当我查看创建凭据所执行的步骤时,我意识到我可能忽略了这一步:Credentials for running jobs .
这是否意味着我应该为我的作业创建一个单独的数据库?我们只处理一个数据库,它与包含我的表的数据库相同。
更新2:
我创建的弹性作业代理将我的数据库指定为作业数据库。所以一切显然都在同一个数据库上。
最佳答案
看来您不需要为Azure Elastic Job
创建单独的数据库,也许您在创建Azure Elastic Job
时忽略了某些内容。
可以引用我使用sql创建的过程:
use master;
CREATE LOGIN masteruser WITH PASSWORD='qazwsx!1111';
CREATE LOGIN jobuser WITH PASSWORD='qazwsx!1111';
use master;
CREATE USER masteruser FROM LOGIN masteruser;
use gongdb;
CREATE USER masteruser FROM LOGIN masteruser;
use gongdb;
CREATE USER jobuser FROM LOGIN jobuser;
GRANT CREATE TABLE TO jobuser;
EXEC sp_addrolemember 'db_owner', 'jobuser';
use gongdb;
-- Create a db master key if one does not already exist, using your own password.
CREATE MASTER KEY ENCRYPTION BY PASSWORD='qazwsx!1111';
-- Create a database scoped credential.
CREATE DATABASE SCOPED CREDENTIAL jobuser
WITH IDENTITY = 'jobuser',
SECRET = 'qazwsx!1111';
CREATE DATABASE SCOPED CREDENTIAL masteruser
WITH IDENTITY = 'masteruser',
SECRET = 'qazwsx!1111';
SELECT * FROM sys.database_scoped_credentials
EXEC jobs.sp_add_target_group 'DemoGroup';
SELECT * FROM jobs.target_groups WHERE target_group_name='DemoGroup';
EXEC jobs.sp_add_target_group_member 'DemoGroup',
@target_type = 'SqlServer',
@refresh_credential_name='masteruser', --credential required to refresh the databases in server
@server_name='<server>.database.windows.net'
GO
EXEC jobs.sp_add_job @job_name='CreateTableTest', @description='Create Table Test'
EXEC jobs.sp_add_jobstep @job_name='CreateTableTest',
@command=N'IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id(''Test''))
CREATE TABLE [dbo].[Test]([TestId] [int] NOT NULL);',
@credential_name='jobuser',
@target_group_name='DemoGroup'
SELECT * FROM jobs.jobs
SELECT js.* FROM jobs.jobsteps js
JOIN jobs.jobs j
ON j.job_id = js.job_id AND j.job_version = js.job_version
exec jobs.sp_start_job 'CreateTableTest';
SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC
====================更新======================
创建 Azure 弹性作业
时,您只需指定一个数据库作为作业数据库。
目标数据库是您需要访问的数据库。例如,如果您在gongdb
中执行建表操作,则您的目标数据库为gongdb
。
为了让Azure Elastic Job
访问目标数据库,您需要为目标数据库创建USER
,然后创建访问所需的凭据。
之所以需要master db
是因为master db
是一个权限较高的系统数据库。目标数据库的USER
必须由master
创建。
我提供的SQL中,作业数据库和目标数据库都是gongdb,这可能会让你产生误解。
关于sql-server - 弹性作业代理在逻辑应用程序中执行作业时立即超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65296252/