Octopus.Script exported 2022-08-30 by thomasdc belongs to ‘SQL Server’ category.
Requires SMO to be installed on the machine where this step will be run.
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Database Server Name
SMO_SqlServer =
Name of the to create the login for.
Database Name
SMO_SqlDatabase
Name of the database. The created Login and User will get the role dbowner by defaultfor this database.
Windows Login Name
SMO_LoginName
The login name to create a login and user in the database for. In our projects we use integrated security - you should too.
Database Role Names
SMO_SqlRole = db_owner
We default to db_owner
, you might want to change this to suit your needs. You may specify multiple roles separated by a comma (e.g. db_datareader,db_datawriter
)
Script body
Steps based on this template will execute the following PowerShell script.
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
try
{
$server = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $SMO_SqlServer
$server.ConnectionContext.LoginSecure = $true
if(!$server.Databases.Contains($SMO_SqlDatabase))
{
throw "Server $SMO_SqlServer does not contain a database named $SMO_SqlDatabase"
}
if ($server.Logins.Contains($SMO_LoginName))
{
Write-Host "Login $SMO_LoginName already exists in the server $SMO_SqlServer"
}
else
{
Write-Host "Login $SMO_LoginName does not exist, creating"
$login = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Login -ArgumentList $SMO_SqlServer, $SMO_LoginName
$login.LoginType = [Microsoft.SqlServer.Management.Smo.LoginType]::WindowsUser
$login.PasswordExpirationEnabled = $false
$login.Create()
Write-Host "Login $SMO_LoginName created successfully."
}
$database = $server.Databases[$SMO_SqlDatabase]
if ($database.Users[$SMO_LoginName])
{
Write-Host "User $SMO_LoginName already exists in the database $SMO_SqlDatabase"
}
else
{
Write-Host "User $SMO_LoginName does not exist in the database $SMO_SqlDatabase, creating."
$dbUser = New-Object -TypeName Microsoft.SqlServer.Management.Smo.User -ArgumentList $database, $SMO_LoginName
$dbUser.Login = $SMO_LoginName
$dbUser.Create()
Write-Host "User $SMO_LoginName created successfully in the database $SMO_SqlDatabase."
}
if($SMO_SqlRole -ne $null)
{
$SMO_SqlRoles = $SMO_SqlRole.Split(",")
# Remove the user from any roles which aren't specified in the $SMO_SqlRole parameter if they are a member
$database.Users[$SMO_LoginName].EnumRoles() | ForEach {
if (!$SMO_SqlRoles.Contains($_)) {
$dbRole = $database.Roles[$_]
$dbRole.DropMember($SMO_LoginName)
$dbRole.Alter()
Write-Host "User $SMO_LoginName removed from $_ role in the database $SMO_SqlDatabase."
}
}
# Add the user to any roles which are specified in the $SMO_SqlRole parameter if they are not already a member
$SMO_SqlRoles | ForEach {
$dbRole = $database.Roles[$_]
if(!$dbRole) { throw "Database $SMO_SqlDatabase does not contain a role named $_" }
if (!$dbRole.EnumMembers().Contains($SMO_LoginName))
{
$dbRole.AddMember($SMO_LoginName)
$dbRole.Alter()
Write-Host "User $SMO_LoginName successfully added to $_ role in the database $SMO_SqlDatabase."
}
}
}
}
catch
{
$error[0] | format-list -force
Exit 1
}
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": "7ed93dfa-b137-4341-9c6c-84fa0565d865",
"Name": "SQL - Create Database Login and User using SMO",
"Description": "Requires SMO to be installed on the machine where this step will be run.",
"Version": 9,
"ExportedAt": "2022-08-30T13:37:42.214Z",
"ActionType": "Octopus.Script",
"Author": "thomasdc",
"Parameters": [
{
"Id": "24633e35-94cb-4b69-befe-0ef2616c3071",
"Name": "SMO_SqlServer",
"Label": "Database Server Name",
"HelpText": "Name of the to create the login for.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "b79baa48-af97-4ee0-bf79-822fbd529636",
"Name": "SMO_SqlDatabase",
"Label": "Database Name",
"HelpText": "Name of the database. The created Login and User will get the role dbowner by defaultfor this database.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "d189015a-237d-46eb-839b-84c3572c40d1",
"Name": "SMO_LoginName",
"Label": "Windows Login Name",
"HelpText": "The login name to create a login and user in the database for. In our projects we use integrated security - you should too.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "9bf187dd-bcf1-4fba-a5b0-2bcddde7ef73",
"Name": "SMO_SqlRole",
"Label": "Database Role Names",
"HelpText": "We default to `db_owner`, you might want to change this to suit your needs. You may specify multiple roles separated by a comma (e.g. `db_datareader,db_datawriter`)",
"DefaultValue": "db_owner",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.ScriptBody": "[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null\n\ntry\n{\n $server = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $SMO_SqlServer\n \n $server.ConnectionContext.LoginSecure = $true\n\n if(!$server.Databases.Contains($SMO_SqlDatabase))\n {\n throw \"Server $SMO_SqlServer does not contain a database named $SMO_SqlDatabase\"\n }\n\n if ($server.Logins.Contains($SMO_LoginName))\n {\n Write-Host \"Login $SMO_LoginName already exists in the server $SMO_SqlServer\"\n }\n else\n {\n Write-Host \"Login $SMO_LoginName does not exist, creating\"\n $login = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Login -ArgumentList $SMO_SqlServer, $SMO_LoginName\n $login.LoginType = [Microsoft.SqlServer.Management.Smo.LoginType]::WindowsUser\n $login.PasswordExpirationEnabled = $false\n $login.Create()\n Write-Host \"Login $SMO_LoginName created successfully.\"\n }\n\n $database = $server.Databases[$SMO_SqlDatabase]\n\n if ($database.Users[$SMO_LoginName])\n {\n Write-Host \"User $SMO_LoginName already exists in the database $SMO_SqlDatabase\"\n }\n else\n {\n Write-Host \"User $SMO_LoginName does not exist in the database $SMO_SqlDatabase, creating.\"\n $dbUser = New-Object -TypeName Microsoft.SqlServer.Management.Smo.User -ArgumentList $database, $SMO_LoginName\n $dbUser.Login = $SMO_LoginName\n $dbUser.Create()\n Write-Host \"User $SMO_LoginName created successfully in the database $SMO_SqlDatabase.\"\n }\n\n if($SMO_SqlRole -ne $null)\n {\n $SMO_SqlRoles = $SMO_SqlRole.Split(\",\")\n \n # Remove the user from any roles which aren't specified in the $SMO_SqlRole parameter if they are a member\n $database.Users[$SMO_LoginName].EnumRoles() | ForEach {\n if (!$SMO_SqlRoles.Contains($_)) {\n $dbRole = $database.Roles[$_]\n $dbRole.DropMember($SMO_LoginName)\n $dbRole.Alter()\n Write-Host \"User $SMO_LoginName removed from $_ role in the database $SMO_SqlDatabase.\"\n }\n }\n \n # Add the user to any roles which are specified in the $SMO_SqlRole parameter if they are not already a member\n $SMO_SqlRoles | ForEach {\n $dbRole = $database.Roles[$_]\n if(!$dbRole) { throw \"Database $SMO_SqlDatabase does not contain a role named $_\" }\n\n if (!$dbRole.EnumMembers().Contains($SMO_LoginName))\n {\n $dbRole.AddMember($SMO_LoginName)\n $dbRole.Alter()\n Write-Host \"User $SMO_LoginName successfully added to $_ role in the database $SMO_SqlDatabase.\"\n }\n }\n }\n}\ncatch\n{\n $error[0] | format-list -force\n Exit 1\n}",
"Octopus.Action.Script.Syntax": "PowerShell"
},
"Category": "SQL Server",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/sql-smo-create-login-and-user.json",
"Website": "/step-templates/7ed93dfa-b137-4341-9c6c-84fa0565d865",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Tuesday, August 30, 2022