Чтобы выполнить довольно длинный SQL-запрос в Logic App, я сохранил его как хранимую процедуру в своей базе данных, а затем создал задания и шаги для запуска хранимой процедуры, а также владельца и целевую группу для моего задания. Я вижу свою работу, учетные данные и целевую группу в Elastic Job Agent, который я создал, чтобы моя работа работала.
Когда я запускаю запрос непосредственно к базе данных, он выполняется успешно и занимает около 28 минут.
Я запускаю задание в своем приложении логики. Это означает, что я не запускаю запрос напрямую, а создаю задание, которое запускает хранимую процедуру как шаг.
Но когда я смотрю в Elastic Job Agent, чтобы увидеть результат, я замечаю, что он сразу же истекает. Запрос, похоже, не выполняется. Это я знаю, потому что в начале запроса я очищаю таблицу и не вижу, что происходит.
Как я уже упоминал, приложение Logic довольно простое и выполняет только эту работу.
Причина, по которой я делаю все это, связана с проблемой тайм-аута, которую Logic App имеет для длинных запросов SQL. Но теперь я получаю тайм-аут в Elastic Job Agent даже быстрее, чем 2-минутный предел приложения Logic.
ОБНОВЛЯТЬ:
Когда я смотрю на шаги, которые я прошел для создания учетных данных, я понимаю, что мог пропустить этот шаг: Учетные данные для выполнения заданий.
Означает ли это, что я должен создать отдельную базу данных для своих заданий? Мы имеем дело только с одной базой данных, которая содержит мои таблицы.
ОБНОВЛЕНИЕ 2:
Для созданного мной агента Elastic Job моя база данных назначена в качестве базы данных Job. Так что все видимо на одной БД.
Вроде и не нужно создавать отдельную базу для 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 Elastic Job
, вы указываете только одну базу данных в качестве базы данных заданий.
Target db — это база данных, к которой вам нужно получить доступ. Например, если вы выполняете операции по созданию таблиц в gongdb
, вашей целевой базой данных будет gongdb
.
Чтобы Azure Elastic Job
получил доступ к целевой базе данных, вам необходимо создать USER
для целевой базы данных, а затем создать учетные данные, необходимые для доступа.
Причина, по которой master db
необходима, заключается в том, что master db
— это системная база данных с более высоким авторитетом. USER
целевой базы данных должен быть создан master
.
В предоставленном мной SQL и база данных заданий, и целевая база данных являются gongdb, что может вызвать у вас недопонимание.
Тогда почему в документации указано, что они должны быть отдельными. Пожалуйста, посмотрите на эту ссылку и на диаграмму, где есть 3 отдельные базы данных. learn.microsoft.com/en-us/azure/azure-sql/database/…
И просто для ясности, где во всем этом Elastic Job Agent? Если я создам Elastic Job Agent и назначу ваш gongdb
в качестве базы данных JobDatabase, будет ли это работать?
Спасибо, Фрэнк! Это многое проясняет, кроме последнего вопроса. Основываясь на вашем последнем предложении, могут ли база данных заданий и целевая база данных быть одним и тем же? Если да, то почему в документации написано, что Job Database должна быть "чистой и пустой"? Вы сами пробовали использовать одну и ту же БД как для работы, так и для цели?
Судя по результатам моих тестов, это нормально. Я успешно выполнил задание по созданию таблицы в моей целевой базе данных. Может быть, вы можете проверить это сами, чтобы убедиться в этом. Что касается того, почему в документе написано Job Database should be "clean and empty
, мне не очень понятно.
Точнее, меня это сильно смутило, и мы не можем себе позволить добавить новую базу только для этой цели. Я попробую ваше решение, но, зная, что вы проверили себя, и я с вами на 90% реализации, я считаю, что у вас есть правильный ответ.
@disasterkid Я рад видеть, что ты разрешил сомнения!
Вы можете выполнить
exec jobs.sp_start_job '<Your_Job_Name>'; SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC
и показать намlast_message
? Ставьте лайк этому.