Можно ли создать базу данных в SQL Server с PowerShell? - PullRequest
15 голосов
/ 08 ноября 2011

Я пытаюсь создать пустую базу данных на сервере SQL с использованием powershell и SMO, но, похоже, не могу найти способ сделать это. Возможно ли это?

Сценарий подключения для сервера sql:

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

$serverName = "localhost"

$server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverName

$server.ConnectionContext.LoginSecure=$false;
$credential = Get-Credential
$loginName = $credential.UserName -replace("\\","")
$server.ConnectionContext.set_Login($loginName);
$server.ConnectionContext.set_SecurePassword($credential.Password)
$server.ConnectionContext.ApplicationName="SQLDeploymentScript"

Ответы [ 7 ]

27 голосов
/ 08 ноября 2011

SMO, безусловно, поддерживает метод создания базы данных - связанная страница MSDN включает пример powershell:

$srv = new-Object Microsoft.SqlServer.Management.Smo.Server("(local)")
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($srv, "Test_SMO_Database")
$db.Create()
Write-Host $db.CreateDate
3 голосов
/ 11 мая 2016

В моем скрипте go.bat, который устанавливает среду для службы, я проверяю, существует ли база данных, а если нет, я ее создаю.

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$server = new-object ("Microsoft.SqlServer.Management.Smo.Server") .

$dbExists = $FALSE
foreach ($db in $server.databases) {
  if ($db.name -eq "Db") {
    Write-Host "Db already exists."
    $dbExists = $TRUE
  }
}

if ($dbExists -eq $FALSE) {
  $db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, "Db"
  $db.Create()

  $user = "NT AUTHORITY\NETWORK SERVICE"
  $usr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.User -argumentlist $db, $user
  $usr.Login = $user
  $usr.Create()

  $role = $db.Roles["db_datareader"]
  $role.AddMember($user)
}
1 голос
/ 10 марта 2017

Слишком много хлопот выше, если вы спросите меня, это прекрасно работает:

$s = New-PSSession -ComputerName SQLDB -Credential DOMAIN\USER

Invoke-Command -Session $s -ScriptBlock {Invoke-Sqlcmd -ServerInstance SQLDB\INSTANCE -InputFile C:\Users\USER\Downloads\CREATEDB.sql}

Единственное, вам нужно, чтобы ваш сценарий БД был уже сформирован и вызван из указанного места. Это проще для меня, хотя из-за того, что это небольшая часть большого скрипта - я не хочу раздувать свой скрипт, если мне не нужно, и я могу вызывать скрипты SQL из репозитория.

1 голос
/ 09 ноября 2011

узнал, как это сделать здесь http://msdn.microsoft.com/en-us/library/ms162577.aspx

Мой код сейчас:

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

$serverName = "localhost"

$server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverName

$server.ConnectionContext.LoginSecure=$false;
$credential = Get-Credential
$loginName = $credential.UserName -replace("\\","")
$server.ConnectionContext.set_Login($loginName);
$server.ConnectionContext.set_SecurePassword($credential.Password)
$server.ConnectionContext.ApplicationName="SQLDeploymentScript"

#Create a new database
$db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, "Test_SMO_Database"
$db.Create()

#Reference the database and display the date when it was created. 
$db = $server.Databases["Test_SMO_Database"]
$db.CreateDate
0 голосов
/ 14 марта 2019

Да, я использую это в * .ps1 сценарии

$ConnectionString = "Data Source=.\SQLEXPRESS;initial catalog=master;Integrated Security=True;"
$NewDatabaseName = "MyDatabase"

$con = New-Object Data.SqlClient.SqlConnection;
$con.ConnectionString = $ConnectionString;
$con.Open();

# create the database.
$sql = "CREATE DATABASE [$NewDatabaseName] COLLATE SQL_Latin1_General_CP1_CI_AS;"
$cmd = New-Object Data.SqlClient.SqlCommand $sql, $con;
$cmd.ExecuteNonQuery();     
Write-Host "Database $NewDatabaseName is created!";

# close & clear all objects.
$cmd.Dispose();
$con.Close();
$con.Dispose();

Проверьте пример здесь http://www.devcode4.com/article/powershell-create-mssql-database

0 голосов
/ 17 марта 2018

Я не думаю, что создание базы данных с SMO - это правильный выбор, так как для этого нужно установить SMO.Гораздо лучше использовать для этого только инструменты powershell.

Проверьте этот модуль.Он выставляет наиболее полезные команды.Один из них - New-SQLDatabase , который идеально подойдет для вашей ситуации.

Пример:

New-SQLDatabase -SqlInstance "localost" -DatabaseName "NewDatabase" -Path "D:\pathToFiles\"

Creating new database with powershell

0 голосов
/ 27 июля 2017

Этот сценарий реплицирует всю базу данных по умолчанию для создания базы данных T-SQL в SQL 2016:

$Server=[Microsoft.SqlServer.Management.Smo.Server]::new()
$DB=[Microsoft.SqlServer.Management.Smo.Database]::new($Server,"TemporaryDB")
# CONTAINMENT = NONE
$DB.ContainmentType=[Microsoft.SqlServer.Management.Smo.ContainmentType]::None
#ALTER DATABASE [TemporaryDB] SET COMPATIBILITY_LEVEL = 130
$DB.CompatibilityLevel=130
#ALTER DATABASE [TemporaryDB] SET ANSI_NULL_DEFAULT OFF 
$DB.AnsiNullDefault=$false
#ALTER DATABASE [TemporaryDB] SET ANSI_NULLS OFF 
$DB.AnsiNullsEnabled=$false
#ALTER DATABASE [TemporaryDB] SET ANSI_PADDING OFF 
$DB.AnsiPaddingEnabled=$false
#ALTER DATABASE [TemporaryDB] SET ANSI_WARNINGS OFF 
$DB.AnsiWarningsEnabled=$false
#ALTER DATABASE [TemporaryDB] SET ARITHABORT OFF 
$DB.ArithmeticAbortEnabled=$false
#ALTER DATABASE [TemporaryDB] SET AUTO_CLOSE OFF 
$DB.AutoClose=$false
#ALTER DATABASE [TemporaryDB] SET AUTO_SHRINK OFF 
$DB.AutoShrink=$false
#ALTER DATABASE [TemporaryDB] SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF)
$DB.AutoCreateStatisticsEnabled=$true
$DB.AutoCreateIncrementalStatisticsEnabled=$false
#ALTER DATABASE [TemporaryDB] SET AUTO_UPDATE_STATISTICS ON 
$DB.AutoUpdateStatisticsEnabled=$false
#ALTER DATABASE [TemporaryDB] SET CURSOR_CLOSE_ON_COMMIT OFF 
$DB.CloseCursorsOnCommitEnabled=$false
#ALTER DATABASE [TemporaryDB] SET CURSOR_DEFAULT  GLOBAL 
$DB.LocalCursorsDefault=$false
#ALTER DATABASE [TemporaryDB] SET CONCAT_NULL_YIELDS_NULL OFF 
$DB.ConcatenateNullYieldsNull=$false
#ALTER DATABASE [TemporaryDB] SET NUMERIC_ROUNDABORT OFF 
$DB.NumericRoundAbortEnabled=$false
#ALTER DATABASE [TemporaryDB] SET QUOTED_IDENTIFIER OFF 
$DB.QuotedIdentifiersEnabled=$false
#ALTER DATABASE [TemporaryDB] SET RECURSIVE_TRIGGERS OFF 
$DB.RecursiveTriggersEnabled=$false
#ALTER DATABASE [TemporaryDB] SET  DISABLE_BROKER 
$DB.BrokerEnabled=$false
#ALTER DATABASE [TemporaryDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
$DB.AutoUpdateStatisticsAsync=$false
#ALTER DATABASE [TemporaryDB] SET DATE_CORRELATION_OPTIMIZATION OFF 
$DB.DateCorrelationOptimization=$false
#ALTER DATABASE [TemporaryDB] SET PARAMETERIZATION SIMPLE 
$DB.IsParameterizationForced=$false
#ALTER DATABASE [TemporaryDB] SET READ_COMMITTED_SNAPSHOT OFF 
$DB.IsReadCommittedSnapshotOn=$false
#ALTER DATABASE [TemporaryDB] SET  READ_WRITE 
$DB.ReadOnly=$false
#ALTER DATABASE [TemporaryDB] SET RECOVERY FULL 
$DB.RecoveryModel=[Microsoft.SqlServer.Management.Smo.RecoveryModel]::Full
#ALTER DATABASE [TemporaryDB] SET  MULTI_USER 
$DB.UserAccess=[Microsoft.SqlServer.Management.Smo.DatabaseUserAccess]::Multiple
#ALTER DATABASE [TemporaryDB] SET PAGE_VERIFY CHECKSUM  
$DB.PageVerify=[Microsoft.SqlServer.Management.Smo.PageVerify]::Checksum
#ALTER DATABASE [TemporaryDB] SET TARGET_RECOVERY_TIME = 60 SECONDS 
$DB.TargetRecoveryTime=60
#ALTER DATABASE [TemporaryDB] SET DELAYED_DURABILITY = DISABLED 
$DB.DelayedDurability=[Microsoft.SqlServer.Management.Smo.DelayedDurability]::Disabled
#ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
$DB.MaxDop=0
#ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
$DB.MaxDopForSecondary=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::Primary
#ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
$DB.LegacyCardinalityEstimation=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::Off
#ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
$DB.LegacyCardinalityEstimationForSecondary=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::Primary
#ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
$DB.ParameterSniffing=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::On
#ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
$DB.ParameterSniffingForSecondary=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::Primary
#ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
$DB.QueryOptimizerHotfixes=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::Off
#ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
$DB.QueryOptimizerHotfixesForSecondary=[Microsoft.SqlServer.Management.Smo.DatabaseScopedConfigurationOnOff]::Primary

# ON  PRIMARY ( NAME = N'TemporaryDB', FILENAME = N'TemporaryDB.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
$FileGroup=[Microsoft.SqlServer.Management.Smo.FileGroup]::new($DB,"PRIMARY")
$DB.FileGroups.Add($FileGroup)

$DataFile=[Microsoft.SqlServer.Management.Smo.DataFile]::new($FileGroup,"TemporaryDB")
$FileGroup.Files.Add($DataFile)

$DataFile.FileName="TemporaryDB.mdf"
$DataFile.Size=8192
$DataFile.Growth=65536
$DataFile.GrowthType=[Microsoft.SqlServer.Management.Smo.FileGrowthType]::KB
$DataFile.IsPrimaryFile=$true

# LOG ON ( NAME = N'TemporaryDB_log', FILENAME = N'TemporaryDB_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
$LogFile=[Microsoft.SqlServer.Management.Smo.LogFile]::new($DB,"TemporaryDB_log","TemporaryDB_log.ldf")
$LogFile.Size=8192
$LogFile.Growth=65536
$LogFile.GrowthType=[Microsoft.SqlServer.Management.Smo.FileGrowthType]::KB
$DB.LogFiles.Add($LogFile)
#CREATE DATABASE [TemporaryDB]
$DB.Create()
#IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [TemporaryDB] MODIFY FILEGROUP [PRIMARY] DEFAULT
#Not necessary
...