My Profile Photo

[Doug Finke@dfinke]


Researching the optimal; Implementing the practical

Author of 'PowerShell for Developers'


Use PowerShell in Azure Functions to perform a scheduled clean-up task

This post shows you how to use Azure Functions to create a function in PowerShell running on timer to execute SQL against a database in the cloud.

The Azure Portal

Log into Azure and navigate to one of your existing function apps or create a new one.

Click on the + to create a new function.

Then click on Custom function.

Choose PowerShell in the Language drop down. Then the TimerTrigger-PowerShell. Notice the Schedule, this is a cron format. You can set it here or update it later. Now, click Create.

Here is where you paste your PowerShell

You’re all set to go. You can paste any valid PowerShell here (note: valid PowerShell v4.0), save it and the function will run based on the schedule you set.

Now let’s see what PowerShell we can use to access a SQL database in the Azure cloud.

Use Invoke-Sql

This is a shorter version of Lee Holmes’ version, I removed the part that can read Excel or Access files.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function Invoke-Sql {
    ##############################################################################
    ##
    ## Invoke-SqlCommand.ps1
    ##
    ## From Windows PowerShell Cookbook (O'Reilly)
    ## by Lee Holmes (http://www.leeholmes.com/guide)
    ##
    ##############################################################################

    param(
        [string] $dataSource,
        [string] $database,
        [string] $sqlCommand,
        [System.Management.Automation.PsCredential] $credential
    )

    ## Prepare the authentication information. By default, we pick
    ## Windows authentication
    $authentication = "Integrated Security=SSPI;"

    ## If the user supplies a credential, then they want SQL
    ## authentication
    if ($credential) {
        $plainCred = $credential.GetNetworkCredential()
        $authentication = 
        ("uid={0};pwd={1};" -f $plainCred.Username, $plainCred.Password)
    }

    ## Prepare the connection string out of the information they
    ## provide
    $connectionString = "Provider=sqloledb; " + 
    "Data Source=$dataSource; " + 
    "Initial Catalog=$database; " + 
    "$authentication; "

    ## Connect to the data source and open it
    $connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
    $command = New-Object System.Data.OleDb.OleDbCommand $sqlCommand, $connection
    $connection.Open()

    ## Fetch the results, and close the connection
    $adapter = New-Object System.Data.OleDb.OleDbDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    [void] $adapter.Fill($dataSet)
    $connection.Close()

    ## Return all of the rows from their query
    $dataSet.Tables | Select-Object -Expand Rows
}

Next up, let’s call it with some parameters.

Calling Invoke-Sql

Here we go, specify the uid and pwd. Construct your sqlcommand, specify your datasource (here you can also point to an Azure database), finally identify the database and you have an Azure function that runs on a timer and deletes rows from a table.

1
2
3
4
5
6
7
8
9
10
11
12
13
$uid = '<The SQL User ID>'
$pwd = '<The Password>'

$securePassword = $pwd | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $uid, $securePassword

$sqlcommand="DELETE from <TargetTable> WHERE <Flag='True'>"

Invoke-Sql `
    -datasource "<AzureCloudDB>.database.windows.net" `
    -database "<TargetDatabase>" `
    -credential $cred `
    -sqlcommand $sqlcommand

Note

This post was inspired by this C# version