sql-server-2008 - una - restaurar base de datos sql server 2012 a 2008
¿Es posible crear una base de datos en SQL Server con powershell? (5)
SMO sin duda es compatible con un método de creación de base de datos : la página MSDN vinculada incluye un ejemplo de 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
Intento crear una base de datos vacía en SQL Server usando powershell y SMO, pero parece que no puedo encontrar la forma de hacerlo. es posible?
Script de conexión para el servidor 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"
descubrió cómo hacer esto aquí http://msdn.microsoft.com/en-us/library/ms162577.aspx
Mi código ahora:
[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
En mi script go.bat, que configura el entorno para el servicio, verifico si el db existe, y si no, creo uno.
[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)
}
Demasiadas molestias arriba si me preguntas, esto funciona bien:
$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}
Lo único es que necesitará tener su script de DB ya formado y llamado desde dicha ubicación. Esto es más fácil para mí, sin embargo, debido a que esto es una pequeña parte de un script más grande - no quiero hinchar mi script si no tengo que hacerlo y puedo llamar a los scripts SQL de un repositorio.
Este script replica toda la creación de base de datos predeterminada T-SQL en 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