Octopus.Script exported 2021-02-12 by twerthi belongs to ‘SQL Server’ category.
Create a SQL Login if the login doesn’t already exist without using SMO.
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
SQL Server
createSqlServer =
The SQL Server to perform the action on
SQL Login
createSqlLoginUserWhoHasCreateUserRights =
The user who has permissions to create the user
Leave blank for integrated security
SQL Password
createSqlLoginPasswordWhoHasRights =
The password of the user who has permissions to create SQL Logins
Leave blank for integrated security
Username to create
createSqlLogin =
The SQL Login name that will be created
Password
createSqlPassword =
The password of the user being created. Leave this blank if you want to use windows authentication.
Default Database
createSqlDefaultDatabase = master
The default database for the user
Script body
Steps based on this template will execute the following PowerShell script.
Function Test-AzureSQL
{
# Define parameters
param ($SqlConnection)
# Define local variables
$azureDetected = $false
# Create command object
$command = $SqlConnection.CreateCommand()
# Check state
if ($SqlConnection.State -ne [System.Data.ConnectionState]::Open)
{
# Open the connection
$SqlConnection.Open()
}
# Set command text
$command.CommandType = [System.Data.CommandType]::Text
$command.CommandText = "SELECT SERVERPROPERTY ('edition')"
# Execute statement
$reader = $command.ExecuteReader()
# Read results
while ($reader.Read())
{
# Get value from field
$value = $reader.GetValue(0)
# Check to see if it's Azure
if ($value -like "*Azure*")
{
# It's azure
$azureDetected = $true
# break
break
}
}
# Check to see if reader is open
if ($reader.IsClosed -eq $false)
{
# Close reader object
$reader.Close()
}
# Not found
return $azureDetected
}
if ([string]::IsNullOrWhiteSpace($createSqlLoginUserWhoHasCreateUserRights) -eq $true){
Write-Host "No username found, using integrated security"
$connectionString = "Server=$createSqlServer;Database=master;integrated security=true;"
}
else {
Write-Host "Username found, using SQL Authentication"
$connectionString = "Server=$createSqlServer;Database=master;User ID=$createSqlLoginUserWhoHasCreateUserRights;Password=$createSqlLoginPasswordWhoHasRights;"
}
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = $connectionString
$command = $sqlConnection.CreateCommand()
$command.CommandType = [System.Data.CommandType]'Text'
Write-Host "Opening the connection to $createSqlServer"
$sqlConnection.Open()
$isAzureSQL = Test-AzureSQL -SqlConnection $sqlConnection
$escapedLogin = $createSqlLogin.Replace("'", "''")
Write-Host "Running the if not exists then create user command on the server for $escapedLogin"
if ([string]::IsNullOrWhiteSpace($createSqlPassword) -eq $true) {
Write-Host "The password sent in was empty, creating account as domain login"
$command.CommandText = "IF NOT EXISTS(SELECT 1 FROM sys.server_principals WHERE name = '$escapedLogin')
CREATE LOGIN [$createSqlLogin] FROM WINDOWS"
if ($isAzureSQL -eq $false)
{
$command.CommandText += " with default_database=[$createSqlDefaultDatabase]"
}
}
else {
Write-Host "A password was sent in, creating account as SQL Login"
$escapedPassword = $createSqlPassword.Replace("'", "''")
$command.CommandText = "IF NOT EXISTS(SELECT 1 FROM sys.sql_logins WHERE name = '$escapedLogin')
CREATE LOGIN [$createSqlLogin] with Password='$escapedPassword'"
if ($isAzureSQL -eq $false)
{
$command.CommandText += ", default_database=[$createSqlDefaultDatabase]"
}
}
$command.ExecuteNonQuery()
Write-Host "Successfully created the account $createSqlLogin"
Write-Host "Closing the connection to $createSqlServer"
$sqlConnection.Close()
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "d4d7d32d-0aec-4a9e-8455-7f91fcd0d6fb",
"Name": "SQL - Create SQL User If Not Exists",
"Description": "Create a SQL Login if the login doesn't already exist without using SMO.",
"Version": 5,
"ExportedAt": "2021-02-12T17:21:40.762Z",
"ActionType": "Octopus.Script",
"Author": "twerthi",
"Parameters": [
{
"Id": "95996aae-c3ec-4d6f-ac24-486d33513620",
"Name": "createSqlServer",
"Label": "SQL Server",
"HelpText": "The SQL Server to perform the action on",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "443c9e33-4f94-4141-bae8-24eec4f133d2",
"Name": "createSqlLoginUserWhoHasCreateUserRights",
"Label": "SQL Login",
"HelpText": "The user who has permissions to create the user\n\nLeave blank for integrated security",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "0bf48c89-31a2-4462-9be3-3f80e816f0de",
"Name": "createSqlLoginPasswordWhoHasRights",
"Label": "SQL Password",
"HelpText": "The password of the user who has permissions to create SQL Logins\n\nLeave blank for integrated security",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "3f9a4254-db16-4aa5-9ab9-bb8e369ee69e",
"Name": "createSqlLogin",
"Label": "Username to create",
"HelpText": "The SQL Login name that will be created",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "b73a9fb0-1b09-473c-956b-07198e5028cc",
"Name": "createSqlPassword",
"Label": "Password",
"HelpText": "The password of the user being created. Leave this blank if you want to use windows authentication.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "f9746a86-33b5-49b2-9bb2-d528585e9759",
"Name": "createSqlDefaultDatabase",
"Label": "Default Database",
"HelpText": "The default database for the user",
"DefaultValue": "master",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "Function Test-AzureSQL\n{\n\t# Define parameters\n param ($SqlConnection)\n \n # Define local variables\n $azureDetected = $false\n \n # Create command object\n $command = $SqlConnection.CreateCommand()\n\n # Check state\n if ($SqlConnection.State -ne [System.Data.ConnectionState]::Open)\n {\n \t# Open the connection\n $SqlConnection.Open()\n }\n \n # Set command text\n $command.CommandType = [System.Data.CommandType]::Text\n $command.CommandText = \"SELECT SERVERPROPERTY ('edition')\"\n \n # Execute statement\n $reader = $command.ExecuteReader()\n \n # Read results\n while ($reader.Read())\n {\n \t# Get value from field\n $value = $reader.GetValue(0)\n \n # Check to see if it's Azure\n if ($value -like \"*Azure*\")\n {\n \t# It's azure\n $azureDetected = $true\n \n # break\n break\n }\n }\n \n # Check to see if reader is open\n if ($reader.IsClosed -eq $false)\n {\n \t# Close reader object\n $reader.Close()\n }\n \n # Not found\n return $azureDetected\n}\n\nif ([string]::IsNullOrWhiteSpace($createSqlLoginUserWhoHasCreateUserRights) -eq $true){\n\tWrite-Host \"No username found, using integrated security\" \n $connectionString = \"Server=$createSqlServer;Database=master;integrated security=true;\"\n}\nelse {\n\tWrite-Host \"Username found, using SQL Authentication\"\n $connectionString = \"Server=$createSqlServer;Database=master;User ID=$createSqlLoginUserWhoHasCreateUserRights;Password=$createSqlLoginPasswordWhoHasRights;\"\n}\n\n$sqlConnection = New-Object System.Data.SqlClient.SqlConnection\n$sqlConnection.ConnectionString = $connectionString\n\n$command = $sqlConnection.CreateCommand()\n$command.CommandType = [System.Data.CommandType]'Text'\n\nWrite-Host \"Opening the connection to $createSqlServer\"\n$sqlConnection.Open()\n\n$isAzureSQL = Test-AzureSQL -SqlConnection $sqlConnection\n\n$escapedLogin = $createSqlLogin.Replace(\"'\", \"''\")\nWrite-Host \"Running the if not exists then create user command on the server for $escapedLogin\"\n\nif ([string]::IsNullOrWhiteSpace($createSqlPassword) -eq $true) {\n\tWrite-Host \"The password sent in was empty, creating account as domain login\"\n $command.CommandText = \"IF NOT EXISTS(SELECT 1 FROM sys.server_principals WHERE name = '$escapedLogin')\n\tCREATE LOGIN [$createSqlLogin] FROM WINDOWS\"\n \n if ($isAzureSQL -eq $false)\n {\n $command.CommandText += \" with default_database=[$createSqlDefaultDatabase]\"\n }\n \n}\nelse {\n\tWrite-Host \"A password was sent in, creating account as SQL Login\"\n\t$escapedPassword = $createSqlPassword.Replace(\"'\", \"''\")\n\t$command.CommandText = \"IF NOT EXISTS(SELECT 1 FROM sys.sql_logins WHERE name = '$escapedLogin')\n\tCREATE LOGIN [$createSqlLogin] with Password='$escapedPassword'\" \n\n if ($isAzureSQL -eq $false)\n {\n $command.CommandText += \", default_database=[$createSqlDefaultDatabase]\"\n }\n}\n\n\n$command.ExecuteNonQuery()\n\nWrite-Host \"Successfully created the account $createSqlLogin\"\nWrite-Host \"Closing the connection to $createSqlServer\"\n$sqlConnection.Close()"
},
"Category": "SQL Server",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/sql-create-sql-user.json",
"Website": "/step-templates/d4d7d32d-0aec-4a9e-8455-7f91fcd0d6fb",
"Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD9QTFRFlZ+r3DAr6p+dy8/V4G9t////5efp9M7NrLS+wCYm8/T1vcPK1tnd10xK+fn6/PLyUU5O+eXk3+Hk7O3u7/DxS2XoPwAADb9JREFUeNrsnYl6nbgOgMEYDHghGN7/Wa8k70B6s3AOZD5o2umcSaf+0S4bUbX/kat6QB6QB+QBeUAekAfkAXlAHpAH5AF5QB6QB+QBeUAekAckXMv4XwBZVCPVnwcZlZSNXRrzp0HGTkqplrY1zfKHQboGMZwoGvVXQUbVy152QaPUu3XrJJCl6Xsp1/SBfbdunQJiZd/3zVqqmfprIEb1iLHRpLF5s279FsQ0iCH3etQ03R8CQYyq74/MwTbN3wGxQFGRRJTaJiVL815z/wXIIiviQEunq2lsNyZhvdfcfw6iCMPavl9H20jkgV8gP1F2NRRJmvEvgIA4gAS0B8xkpexEYWB3F0ijAyOxfwAkcsBvHQk53QWW71HwGm8PIhJHazIS98HYdUqBar1TJD8EYQOABGNe+w0J0dj3iuSHIOMw6PRHOyDpdhggE2XvDmLYAChsDh4MSPI1g92DWkGaosbbey0kARbOyFCaTCYgDemioQWp3D+O9EO4NGNCRpIFMKQzjlG9TyS/iOwoE64jjeaVwICOzjeoGfgue38QshPRMV57lhpVjbNemZTMK7X+gaQRSRgQzaz2JDX9CjRiDvWV+gMgRniSltWMMV0TSo1fcIEjEAKUa7k/CDiomkjaeeAU8JEmoRAOuoLp/hWidTJp9RBiipkF07our9fj/Lpmn51MeM2TnAx5gnp/cRZj6P2aD6BdWoBu1QUeiESwWoCu8a10OBfzHUFaATIxoFssfjIxUKbZiJobkg/ibFSNny2aM/pa4Lt0y4eoWwJkQP9S11NQNoOmw18Ic0qDDsIIg59TiC517aTDa5a7OBDPLDjRBMemmbgTCIhjEINbNVpHLXzozzxAhI4mg9ETv7i4DwhYiHa6JfA2T9F6dPltaDwgBQifwgG5ZOAMlpNAZlrShEpW8ykG/mgkCaMmX40LXwX3uUBR21wLgoYxoMOtc22agpJlGBM5AYF5pcFUwOkXXr8Ty2n7IxrWgze4sIo6WrvD4LNx6pc8QDtzHVA0uwGIcJ6otO4IQhahfZLCtqYjYiUwsOlqEMMp8S31w4MIHrUKv1PvnZlhsUJjF4NAWHQ5PCRUIoGA5XutEpMJsquPFjvzX6GcB2I0Ybg45wWDpi/Iz7K07QPiOfZQEwtls7gShCL6kGe6U4tBg8Bmk7syfSjRpF0glOVCEDT3Mp0KQZyV+cxeswKEjur1baGcuc8O66bQsM10C0Wa6jy4oG2E7gXkXeAxdOdhmLkMBPxWSLJyFj5vBKJLURAGJ58m0NKNcuLh01UgLLvXU87CWSEQVlDUSOHu/gQp2xgaTSAidRFISICjl83UiyVYl3/NIdHiKQZy73pNEIq4BqTNzZht2w8sCISjXWjnqYtcEZtLwTBM9c2Qci5I+ouDYs2sQMGPZxH+Y5kGiFIE6nskp4LwEPcmTpaBd99MqZTiLHPK2wwRDAQq5sxVjeS+enMBSGhAzMRhQsTIUOK1Lz9w2cWHZqy+YSevkMiknWvSMRfZoGg2mX1ecBA6yHupCyRCEqDkasaqMYsYc/LGRwWUmdHd7j4dG/x4ukIiE3HQ382KVDF546NAN9XHSmQsWo65wkbmuFSdxcdCtQ7yKP2ZgzLdx9dc19kSEbFqF0mzdsYuDgydf/I/RW8m324jPGUgPPgsoTPz0Af5MNn0p5ZgZpDJ9F6QfI2ztxQf/TT3DS+2J8Hm8b/sYAJxmXeCzJukikdnpcUUG5BeKKzQnfpf0UJUX4gmpyaNdVoQJlWzYSGGG9I5Fz0mXtoJGEh9sPc70ZZErBrN+0AMyyTCkkEwr1BJe1hOwnfysEiQyl5dMWneqlp8iGGCstyI4YLIVKT4gwfDJmvMTHDrIUP44FWz4JbEe93vnIUJXlSHyUDi92rnps1c+/LcgBiG7OIghqu6KHHXYxZlMsLLfpAzlAGTfjB0ICzlgLq0jqO5rGbnIAudtU+KqpAfKiI25XghCM3cuYlvn34+D2Qil5rqKDZlWRY/BA97CkM4aWRb89Pz2+eBsIHMedab1smks62fogs0+JMSDmL+3RH080B8a9qDCJMVvXrehgiu6yiP+pRN0epEgQi3SeUkkgeXXUOuDmdWBn7Wbuh5Gz2U67JtgsvqomUdtw4RQnNx3hMNJ269QS2iXRN7DrmUmXXGIYr+48knBqoTLUR4xztTXzRU73OgSPvSmov27OscELCEQWBgQM1hrjqc2tR+EPx1ojgVZMJTc+hzQzXl2sCc0pVMFkDRLa85iHbWyQe0Xoau1rkrg0AMk5VU5pJCmeXOILR9CMGCJ7cL5TuDJCVReDe7Aoi5K8hUUwKYc4A0MoXCLRy/+vHOIKBYPnXnbVk7BY1KS78zCKPNJShmY/9pjo0ToJjW/PErtJHxniCCjjtAxMBds9LXcrYCIZjFau4PAqURxwg+bDvvuJ/WdeiiEGW8PYge9GSEL7yjMNxOlLGd87XjGi3jriC4k4tHY8H5Gn94GUtc56QiCBn5eGcQMHRB9epEe2yDE0boe4y2i0f8jUcBkPV2IHg2nmHDkwk+uAqD573Q1dps0WAqYPTLi0L7r0CAAXs4NR3vxy8mi+fDAKRQI0AZ7wgyD7j8AQ/O0bMjrDFL8cjeYu0m+KEDux2IyLo4qFM0Q6R4GKnbgbQ3BDE6UdRsXpxWdblIrN00p0fiuBfIpCMGbtIafHwS8UAkYaHG2uLpRHBcKzqvW4GM6Skxhs62a6R7fh0fPgyZripARnK8NwOJ8gh9UXz00K0fn5p2v1uUXXZp771AhN6cc8PZLt4ejFJ+3INV8fm3cQkl7nqngOj9le7jJ8ARAwgqF0HFhxDHDq775Vp0SgGb/308XEEjg5KLbUgmo1Kdx8hSlRuBOHlU2bPfBp8GzSIGPn1o246e3BvBB9usKLwPCHPHqPAx42C1thAIkTQKn80fF6tsNtHiTiB0imelAQlBIluBOJmAVPBRXWXL6QM3ATGYslPhKpNEmq1AnJ04kI2vvQnIxAftXWofQRYUyGZxOJMDOXZjd+4BYnU6mZdApOw3AulwcAWR2O2ib9EOEoNOSSCqFi1f4ViXbL2Lokki3ka2MrkDiKryg5IIgqePRpxRozYUjmQxi9o+Pb1e3/tVVTG1yaJuGZz2IHt/nGoEN9zQbBe1di53NOCEi3p3vbwbX8oD7n1PkzfwH5RljX7iDs7fMDQ5yHrrtrmpLFeDyKraqDbpFk6pkRKsO04NckYBJW8a5bZCpWh9s7HrXpMzfhVEVdX2RtLENhpJJSWNcUKMkBqqppgTBmKBPGVEVeu68UIQ4NjPLwtjtUg08KOx2dCK3eQ2SOQtSAMkciHIUlX9/tMmkRQUXiB7JwtlbpbPXwBiqqra3cZVxUlnSaPCHwCLPzo/jYp1JUi/U6yuwZltNH6uPxh8YuXRHKcRdMsCSHsViK0KjzUqWSWMvt8bj5EHY3LR3MfWdt1yGUiVCQRFUdGXBNWqjklU6KhkOmUpD4Yqq1uvAmkAZHVdBZrXBhQ0CXcBDmcm2y4c+uHCnGxIVJZNlfVWkIpcVgf330HY0e19UIqyODMpyUGzlkwYWb4FkfFFtv7/QSwtP0CYTFCUxq877VpzgWASmWXAdtN7fCdIUKcyUEBo6StSKU9i8s6Q7Lyboiw4a9JhfL8KpE/j/3Lr7WMzyJHEiqTzAjEuoy+cs/Nc14CYqjoK62AxMnnbPqTAVC+iQHBQOUbFctnYUjFXSYQU6yD36vNAntTL0sCzhvL57d03arfP8GaJVJu/fu03xUnn1KtznSGXCO/vPVYmS3uljWx1q/eRJQ/mfr6sT+ibIy+LFZZpr/VayyZE7lPCzk2XpQmznwxffulova/FkUIk3VFxAiWIT+jlZwOL15eOcftSZK+KpR94MaNkVmF9MggQQ7y5EERVpXKBoZfeyNhYmXjVOjYRTFXaC0G8SIKb2lbvnYzlFU2PX7y977TotZr1FZDFk7ipnoWhLzJUJqBO1BmiXpYfxVyuGzdNzKUglMgHmWQRfWloSDmkYW6BaZwppryeJenYi8eBfqn50ESZNMFARuUyYhnbV2qbBVuXpjQuczdF+nhVO6j3JIszENO4MCkzmx59C3VbpvuWtrUvHr/+9QZdcMPGyUJu2gtyN4U5erV1wZHlLx7H/NWWaRNAKK3fh2572IaIFkNiMXcACb4LKI5KCih8q+PH7QxVV0v36pHlX99WMLLaBfmi8D2I5ytOlZYY6ZtXv2rhOztWNghlp1gdvpxgr1ApnR9f/qaFb+0hRqFsh6tjMNmJIo+J9uWvI/nm9vQaUfIb3JQG0imXz2fRsHn5C2K+e2DArH1QsNhvGKuUR462OWhsr/Llbyf4yaEaGR2Yu83gsVaftLgMUtqN4b/hFR4/O69lk1iUsVTTG+VFofbbz+YN73776VFAH99dG1Iu7l09Uh1bdCdf/wqlXxyXHRML5sD/GBD/jpfx/fJsvOttu589vnXv2KhAIBgYQQNfNg//hBdyQcio+vCjxxpks1gLApmqj+rjox0/5G1BgteVfbaPhTjR6Okwl/kAFtl/9PcGyWqpPutEYFW1dM5CAARkcneJlDwLlVP+dVDhMNdHW8mP45TzriBZ7k+Xi4W9kbMS0v5JkDdeD8gD8oA8IA/IA/KAPCAPyAPygDwgD8gD8oA8IA/IA/IXr/8JMAAhf0RDrOWy2QAAAABJRU5ErkJggg==",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Friday, February 12, 2021