13403 Views
5 minutes read
Categories
Azure

Schedule the Execution of SQL Jobs in Azure with Automation Service

When you are migrating your database in SQL Azure, the first thing you face that how will you schedule your SQL jobs? Microsoft Azure Automation provides a way for scheduling SQL jobs by creating and scheduling runbooks. You can automate processes using runbooks. This article provides brief overview of Azure Automation and answers some common questions.

Step 1: Create an Automation account in Azure

Go to your Azure Portal. Click on more service and filter with “automation”.

Select Automation accounts.

I named the automation account as SQLAutomation, now choose the resource group & location as per your choice.

Step 2: Create new Credential

Go to the automation account, and create a new credential for your DB. This is required to connect your SQL DB . Enter the name SQLDBCredential and enter user id & password. This user should have the access in your DB and credential to run the store procedure.

Step 3: Store procedure

Here I am going to create a table and a store procedure.

CREATE TABLE [dbo].[Record_AzureScheduler](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[AzureUser] [nvarchar](max) NULL,
	[AzureSchedulerTime] [nvarchar](max) NULL,
	[Inserdatetime] [datetime] NOT NULL CONSTRAINT [DF_Record_AzureScheduler_Inserdatetime]  DEFAULT (getdate()),
 CONSTRAINT [PK_Record_AzureScheduler] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)

CREATE PROCEDURE [dbo].[stp_Insert_Record_AzureScheduler]  
(
@AzureAdmin nvarchar(max) = 'Scheduler',
@AzureSchedulerTime nvarchar(max) = null)
as
Begin
	 
	INSERT INTO  [dbo].Record_AzureScheduler
	SELECT @AzureAdmin,@AzureSchedulerTime  

END

You can use your own store procedure.

You may also like: Build a Superior Enterprise Cloud with Microsoft

Step 4: Create new Runbook

Under the SQLAutomation automation account ,create a new RunBook with name “RB_Record_AzureScheduler”.

Choose the type “PowerShell Workflow”.

Create another runbook with name “RB_Record_AzureScheduler_JobAgent” with same type, this we will schedule later.

Step 4.1: Runbook – RB_Record_AzureScheduler

workflow RB_Record_AzureScheduler
{
    [OutputType([string])]
     param
     (
       [Parameter(Mandatory=$true)] [string] $SqlServer,
        [Parameter(Mandatory=$false)] [int] $SqlServerPort = 1433,
        [Parameter(Mandatory=$true)] [string] $Database,
        [Parameter(Mandatory=$true)] [string] $SprocName,
        [Parameter(Mandatory=$false)] [string] $Parameters,
        [Parameter(Mandatory=$false)] [string] $SqlCredentialName 

     ) 
    
    #Get Credential Assets
    #Get the username and password from the SQL Credential
    $SqlCredential = Get-AutomationPSCredential -Name $SqlCredentialName
    $SqlUsername = $SqlCredential.UserName
    $SqlPass = $SqlCredential.GetNetworkCredential().Password
    #Get email assets if required
    
         
     #Run SQL Query
     inlinescript
     {
         $haveError = 0
         # Define the connection to the SQL Database
         $DatabaseConnection = New-Object System.Data.SqlClient.SqlConnection("Server=tcp:$using:SqlServer,$using:SqlServerPort; Database=$using:Database; User ID=$using:SqlUsername;Password=$using:SqlPass; Trusted_Connection=False; Encrypt=True; Connect Timeout=7200;") 

         
         $outputDataTable = New-Object System.Data.DataTable
            [string[]] $ColumnNames
             try
             {
                # Open Connection
                $DatabaseConnection.Open()
                $Cmd=new-object system.Data.SqlClient.SqlCommand
                $Cmd.Connection = $DatabaseConnection
                $Cmd.CommandText = 'EXEC ' + $using:SprocName + ' ' + $using:Parameters + '; SELECT @@ROWCOUNT;'
                $Cmd.CommandTimeout = 7200
                # create data adapter from the SQL command
                $sqlDataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
                # declare dataset to hold data
                $dataSet = New-Object System.Data.DataSet
                # print sql command
                Write-Output($Cmd.CommandText)
                # fill the adapter
                $sqlDataAdapter.Fill($dataSet) | out-null
                # records returned?
                if ($dataSet.Tables[0].Rows.Count -gt 0)
                {
                    $outputDataTable = $dataSet.Tables[0]
                }
                else
                {
                    $outputDataTable = "SQL Stroc Proc Executed”
                }
             }
            catch
            {
                 #write your own error handling code here.
                 #if required send error message in email.                
            }
             finally
            {
                 if ($Cmd -ne $null)
                 {
                    $Cmd.Dispose
                 }
                 # Close the SQL connection
                 $DatabaseConnection.Close()
                 $DatabaseConnection.Dispose()
            } 
            
        }
    } 

Step 4.2: Runbook – RB_Record_AzureScheduler

This is the second runbook. Open the runbook and write the code below, replacing your server parameters.

workflow RB_Record_AzureScheduler_JobAgent
{
$dataTable = RB_Record_AzureScheduler -sqlServer '<span style="background:#ffff00">xxxxxxxxxxxx.database.windows.net</span>'-Database 'AppSourceDB'-SprocName 'stp_Insert_Record_AzureScheduler' -Parameters '@AzureAdmin = ''Azure Scheduler'' ,@AzureSchedulerTime =''08 Dec 2017''' -SqlCredentialName 'SQLDBCredential'
Write-Output($dataTable)
 
}

Step 5: Schedule the Runbook

Now our RunBooks are ready, we will schedule the 2nd Runbook (RB_Record_AzureScheduler_JobAgent). Save the RB_Record_AzureScheduler_JobAgent RunBook and publish it. Once the RunBook is published you can see the “Schedule” menu in top bar.

Click on the schedule and create a new scheduler. Name it “Schedule_RB_Record_AzureScheduler_JobAgent” and schedule it every hour

Ok, great your scheduler is ready. Next Link it with the RunBook. Click on the “Link a schedule to your Runbook” and choose the newly created scheduler. Save it.

That’s it! See the below image , the run book is scheduled to run every hour.

Soma Choudhuri

About Soma Choudhuri

Soma Choudhuri is the Sr. Technical Architect at Netwoven Inc. focused on Enterprise Content Management (ECM). In her 19 years of career, her primary area of expertise has been developing and implementing SharePoint collaboration portals and .NET web applications. Soma has been a leading Microsoft technologies expert for clients across USA and India.

Prior to joining Netwoven, she held many organizational leadership roles across manufacturing and financial services industries.

LinkedinTwitterFacebook

4 replies on “Schedule the Execution of SQL Jobs in Azure with Automation Service”

… and step 2 “This user should have the access in your DB and credential to run the store procedure.” does this mean they get permissions automatically, or does it mean there is an extra step where we give them access that is not in the instructions?
Thanks again

Sorry, step 3 is not clear, where do we save the stored procedure? is it inserted in the runbook script or called? I have my sql, is there some part of step 3 that I need to keep or replace it all?
Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *