Question Data Tier Application

Plus d'informations
il y a 12 ans 7 mois #15627 par AngeG
Data Tier Application a été créé par AngeG
Bonjour à tous

Ne sachant pas ou poster vu que cela concerne plusieurs sujets je me permet de poster ici.

je suis actuellement en train de découvrir les data tier application et leurs limitations
Je viens de créer un script powershell qui me permet de backuper une DB puis de lui appliquer un upgrade via un DACPAC. Ceci est mon premier scipt

En cas d'erreur je fais un restore du backup généré tout fonctionne bien par contre dans le script powershell je dois instancier mon server de deux façons différentes pour que ça fonctionne et je ne comprend pas pourquoi, quelqu'un pourrait il m'éclairer

ceci pour toutes les opérations courantes

[code:1]
CD SQLSERVER:\SQL\localhost\DEFAULT
$srv = get-item .
[/code:1]

et ceci pour le backup le kill des process et le restore

[code:1]
$server = New-Object (\"Microsoft.SqlServer.Management.Smo.Server\"«») \"(local)\"
[/code:1]

[code:1]
$smoBackup.SqlBackup($server)
$server.KillAllProcesses($dbName)
$smoRestore.SqlRestore($server)
[/code:1]

Je ne comprends pas pourquoi je suis obligé d'utiliser deux objets sachant qu'ils sont tous les deux du même type \"Microsoft.SqlServer.Management.Smo.Server\"

Merci par avance à tout ceux qui pourront m'aider à éclaircir ce point, si vous désirez que je poste le script complet n'hésitez pas à me le dire, vu qu'il fait quasiment 200 lignes j'ai préféré m'abstenir<br><br>Message édité par: AngeG, à: 16/08/13 16:54

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 7 mois #15630 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:Data Tier Application
Bonjour,

Dans le premier cas, il s'agit d'un Provider SQL sur lequel tu as monté un lecteur (nommé ici 'SQLServer').

[code:1]PS &gt; Get-PSProvider
PS &gt; Get-PSDrive
[/code:1]

Lorsque ce lecteur est monté, tu peux accéder à toute une arborescence, via des chemins.

Pour plus d'informations sur ce fournisseur (Provider) :

Fournisseur PowerShell SQL Server

Les chemins d'accès implémentés par le fournisseur SQL Server permettent de vérifier facilement et de manière interactive tous les objets dans une instance de SQL Server. Vous pouvez parcourir les chemins d'accès à l'aide d'alias Windows PowerShell semblables aux commandes que vous utilisez généralement pour parcourir les chemins d'accès du système de fichiers.


Dans le second cas, tu génères un objet issu d'une classe afin de pouvoir accéder à ses méthodes et à ses propriétés.

Les 2 méthodes que tu cites ne permettent donc pas d'effectuer les mêmes actions, n'ont pas le même but.

Je note que tu n'as pas montré comment tu créés '$smoBackup'. Aussi, la méthode Sqlbackup fait partie de l'Assembly 'Microsoft.SqlServer.SmoExtended.dll' tandis que la classe générale fait partie de l'Assemby 'Microsoft.SqlServer.Smo.dll' ...

Merci par avance à tout ceux qui pourront m'aider à éclaircir ce point, si vous désirez que je poste le script complet n'hésitez pas à me le dire, vu qu'il fait quasiment 200 lignes j'ai préféré m'abstenir


Ne t'abstiens pas, il existe des personnes qui peuvent être intéressées ;)

@ +

Matthew BETTON<br><br>Message édité par: Matthew BETTON, à: 16/08/13 21:13

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 7 mois #15631 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:Data Tier Application
[code:1]$smoBackup = new-object Microsoft.SqlServer.Management.Smo.Backup[/code:1]

:)

Voir

Espace de noms Microsoft.SqlServer.Management.Smo

Ici, un exemple PowerShell est donné :

Backup.SqlBackup Method

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 7 mois #15633 par AngeG
Réponse de AngeG sur le sujet Re:Data Tier Application
Merci beaucoup pour les liens et les explications.
Je vais de ce pas regarder les différents liens que vous m'avez donné.

Ci dessous le script

[code:1]
Write-Host \&quot;Add PSSnapins\&quot;
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

Write-Host \&quot;Loading Microsoft.SqlServer Assemblies...\&quot;
#Load Needed Assemblies
$assemblylist =
\&quot;Microsoft.SqlServer.Management.Common\&quot;,
\&quot;Microsoft.SqlServer.Smo\&quot;,
\&quot;Microsoft.SqlServer.SmoExtended\&quot;,
\&quot;Microsoft.SqlServer.SmoEnum\&quot;,
\&quot;Microsoft.SqlServer.Dmf \&quot;,
\&quot;Microsoft.SqlServer.Instapi \&quot;,
\&quot;Microsoft.SqlServer.SqlWmiManagement \&quot;,
\&quot;Microsoft.SqlServer.ConnectionInfo \&quot;,
\&quot;Microsoft.SqlServer.SmoExtended \&quot;,
\&quot;Microsoft.SqlServer.SqlTDiagM \&quot;,
\&quot;Microsoft.SqlServer.SString \&quot;,
\&quot;Microsoft.SqlServer.Management.RegisteredServers \&quot;,
\&quot;Microsoft.SqlServer.Management.Sdk.Sfc \&quot;,
\&quot;Microsoft.SqlServer.SqlEnum \&quot;,
\&quot;Microsoft.SqlServer.RegSvrEnum \&quot;,
\&quot;Microsoft.SqlServer.WmiEnum \&quot;,
\&quot;Microsoft.SqlServer.ServiceBrokerEnum \&quot;,
\&quot;Microsoft.SqlServer.ConnectionInfoExtended \&quot;,
\&quot;Microsoft.SqlServer.Management.Collector \&quot;,
\&quot;Microsoft.SqlServer.Management.CollectorEnum\&quot;,
\&quot;Microsoft.SqlServer.Management.Dac\&quot;,
\&quot;Microsoft.SqlServer.Management.DacEnum\&quot;,
\&quot;Microsoft.SqlServer.Management.Utility\&quot;

foreach ($asm in $assemblylist)
{
$asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}
Write-Host \&quot;Assemblies loaded\&quot;

$dbToBackup = \&quot;MA_DB\&quot;

#create a new server object and connect
CD SQLSERVER:\SQL\localhost\DEFAULT
$srv = get-item .
$serverconnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($srv.ConnectionContext.SqlConnectionObject)
$serverconnection.Connect()
$server = New-Object (\&quot;Microsoft.SqlServer.Management.Smo.Server\&quot;«») \&quot;(local)\&quot;

write-host $srv.GetType()
write-host $server.GetType()

#Find Backup Directory from server Instance
$backupDirectory = $srv.Settings.BackupDirectory

#Find database tu backup
$db = $srv.Databases[$dbToBackup]
$dbName = $db.Name

$dacName = \&quot;MON_DACPAC\&quot;
$dacstore = New-Object Microsoft.SqlServer.Management.Dac.DacStore($serverconnection)

$timestamp = Get-Date -format yyyyMMddHHmmss

try
{
#Backup Database before Upgrading
write-host \&quot;Backup Database before Upgrading...\&quot;

#display default backup directory
\&quot;Default Backup Directory: \&quot; + $backupDirectory

$smoBackup = New-Object (\&quot;Microsoft.SqlServer.Management.Smo.Backup\&quot;«»)

#BackupActionType specifies the type of backup.
#Options are Database, Files, Log
#This belongs in Microsoft.SqlServer.SmoExtended assembly
$smoBackup.Action = \&quot;Database\&quot;
$smoBackup.BackupSetDescription = \&quot;Full Backup of \&quot; + $dbName
$smoBackup.BackupSetName = $dbName + \&quot; Backup\&quot;
$smoBackup.Database = $dbName
$smoBackup.MediaDescription = \&quot;Disk\&quot;
$smoBackup.Devices.AddDevice($backupDirectory + \&quot;\\&quot; + $dbName + \&quot;_\&quot; + $timestamp + \&quot;.bak\&quot;, \&quot;File\&quot;«»)
$smoBackup.SqlBackup($server)

write-host \&quot;Backup Succedeed\&quot;

#let's confirm, let's list list all backup files
$directory = Get-ChildItem $backupDirectory

#list only files that end in .bak, assuming this is your convention for all backup files
$backupFilesList = $directory | where {$_.extension -eq \&quot;.bak\&quot;}
$backupFilesList | Format-Table Name, LastWriteTime

#deploye Data Tiers Application
#First: Use Pre deployment script
Write-Host \&quot;Invoke Pre Deployment Sql Script\&quot;
invoke-sqlcmd -inputfile \&quot;PATH\Script.PreDeployment.sql\&quot; -serverinstance \&quot;localhost\&quot;
Write-Host \&quot;Script successfully Applied\&quot;

#Second: Use DacPac File to upgrade database
Write-Host \&quot;Upgrade Data Tier Application...\&quot;
$dacpacPath = \&quot;PATH\MON_DACPAC.dacpac\&quot;
$fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)
$dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)

$dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
$dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})

$upgradeProperties = New-Object Microsoft.SqlServer.Management.Dac.DacUpgradeOptions
$upgradeProperties.blockonchanges = $true
$upgradeProperties.ignoredataloss = $true
$upgradeProperties.rollbackonfailure = $true
$upgradeProperties.skippolicyvalidation = $true

$dacstore.IncrementalUpgrade($dacName, $dacType, $upgradeProperties)
$fileStream.Close()
Write-Host \&quot;Data Tiers Application Successfully Upgraded\&quot;

#Third: Use Post Deployment Script
Write-Host \&quot;Invoke Post Deployment Sql Script\&quot;
invoke-sqlcmd -inputfile \&quot;PATH\Script.PostDeployment.sql\&quot; -serverinstance \&quot;localhost\&quot;
write-host \&quot;Script successfully applied\&quot;
write-host \&quot;Finish Upgrade Succesfully\&quot;

$srv.ConnectionContext.Disconnect()
}
catch
{
write-host \&quot;ERROR DURING DATA TIER APPLICATION UPGRADE, RESTORING\&quot; -BackgroundColor \&quot;Yellow\&quot; -ForegroundColor \&quot;Red\&quot;
try
{
$fileStream.Dispose()

write-host(\&quot;Attempt to restore backup\&quot;«»)
#get backup file
#you can also use PowerShell to query the last backup file based on the timestamp
#I'll save that enhancement for later
$backupFile = $backupDirectory + \&quot;\\&quot; + $dbName + \&quot;_\&quot; + $timestamp + \&quot;.bak\&quot;

#we will query the db name from the backup file later
$backupDevice = New-Object (\&quot;Microsoft.SqlServer.Management.Smo.BackupDeviceItem\&quot;«») ($backupFile, \&quot;File\&quot;«»)
$smoRestore = new-object(\&quot;Microsoft.SqlServer.Management.Smo.Restore\&quot;«»)

#settings for restore
$smoRestore.NoRecovery = $false;
$smoRestore.ReplaceDatabase = $true;
$smoRestore.Action = \&quot;Database\&quot;

#show every 10% progress
$smoRestore.PercentCompleteNotification = 10;
$smoRestore.Devices.Add($backupDevice)
#restore
$smoRestore.Database = $dbName
$server.KillAllProcesses($dbName)
$smoRestore.SqlRestore($server)
write-host \&quot;Backup Successfully restored\&quot;

#connect to DacStore
write-host \&quot;Delete invalid DAC...\&quot;

# Subscribe to the DAC delete events.
$dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
$dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})

# Only delete the DAC definition from msdb, the associated database remains active.
$dacstore.Unmanage($dacName)
Write-Host \&quot;Data Tier Application successfully deleted\&quot;

write-host \&quot;Register DAC from backuped Database...\&quot;
#Specify DAC Metadata
$dbVersion = \&quot;1.0.0.0\&quot;
$description = \&quot;Data Tier application registered from backuped database on :\&quot; + $timestamp

# Register the DAC.
$registerunit = New-Object Microsoft.SqlServer.Management.Dac.DacExtractionUnit($srv, $dbName, $dacName, $dbVersion)
$registerunit.Description = $description
$registerunit.Register()
write-host \&quot;Backuped database successfully registered as data tier application\&quot;;

$srv.ConnectionContext.Disconnect()
}
catch
{
write-host \&quot;Failed to restore backup due to: \&quot;
write-host $_Exception;
write-host $_Exception.GetType().FullName;
write-host $_.Exception.Message;
}
write-host \&quot;Failed to Upgrade Data Tier Application due to: \&quot;
write-host $_Exception.GetType().FullName;
write-host $_.Exception.Message;
}
[/code:1]

Sans doute beaucoup d'amélioration à faire mais étant le premier script et n'ayant pas vocation à faire régulièrement du powershell :blush: , la question était surtout pour ma culture personnelle

Message édité par: AngeG, à: 16/08/13 17:49<br><br>Message édité par: AngeG, à: 16/08/13 17:49

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.048 secondes
Propulsé par Kunena