Combinaison d'un script / requête de sauvegarde de database SQL avec PowerShell

J'essaie de combiner ce script de sauvegarde SQL / requête que j'ai avec mon script shell de puissance et je ne suis pas sûr de savoir comment le convertir car je ne sais pas grand chose sur SQL seulement Powershell. J'ai essayé d'utiliser invoke-sqlcmd avant chaque ligne dans le script, mais je ne pense pas que c'est comme cela que vous le faites. Je ne comprends pas complètement la syntaxe de invoke-sqlcmd Micrsoft n'a pas été utile. C'est le script de sauvegarde de database SQL que j'ai besoin d'utiliser:

 DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name -- specify database backup directory SET @path = 'F:\Backups\' -- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name IN ('dbname','dbname','dbname','dbname','dbname','dbname') -- exclude these databases OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName WITH COMPRESSION FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor 

Est-il correct d'append simplement invoke-sqlcmd au invoke-sqlcmd de chaque ligne de requête sql? De plus, la solution à ce problème doit être compatible avec Windows Server 2008 et les versions ultérieures. Je pensais que cela pourrait être aussi simple que de mettre tout le script entre guillemets avec invoke-sqlcmd , mais j'en doute. Chaque fois que je google cela, les réponses sont trop complexes et n'expliquent pas vraiment comment le SQL se connecte à Powershell. Ils pensent juste que tu sais. Le seul champ de ce script qui doit être modifié est le path d'access lorsque vous l'exécutez sur SQL Studio.

Sqlcmd est conçu pour replace l'outil de command line sqlcmd.

Une grande partie de ce que vous pouvez faire avec sqlcmd peut également être faite en utilisant Invoke-Sqlcmd.

Par conséquent, vous allez exécuter vos commands en une seule fois. Soit en utilisant un file externe ou une string SQL multiligne. Voir ci-dessous pour des exemples.

Exemple de file externe

Enregistrez votre script de sauvegarde sql dans un autre file comme backupDaily.sql. Après cela, utilisez la syntaxe suivante.

 Invoke-Sqlcmd -InputFile "C:\backupScripts\backupDaily.sql" | Out-File -filePath "C:\backupScripts\backupDailyCmd.rpt" 

La command provient de la documentation Microsoft .

La bonne chose est que vous pouvez essayer ce file sql dans Sql Server Management Studio pour voir si cela fonctionne.

Exemple de string SQL multiligne

 $SQL_QUERY = @" YOUR QUERY HERE. "@ Invoke-Sqlcmd -Query $SQL_QUERY -ServerInstance "MyComputer\MyInstance" 

Vous pouvez facilement utiliser la substitution de strings ici.

 $name = 'atilla' $SQL_QUERY = @" SELECT * FROM Employees WHERE NAME LIKE $($name) "@ Invoke-Sqlcmd -Query $SQL_QUERY -ServerInstance "MyComputer\MyInstance" 

Je n'utiliserais pas PowerShell pour faire une sauvegarde.

Je reorderais d'utiliser une procédure stockée SQL pour planifier un travail.

  USE msdb ; GO -- creates a schedule named NightlyJobs. -- Jobs that use this schedule execute every day when the time on the server is 01:00. EXEC sp_add_schedule @schedule_name = N'NightlyJobs' , @freq_type = 4, @freq_interval = 1, @active_start_time = 010000 ; GO -- attaches the schedule to the job BackupDatabase EXEC sp_attach_schedule @job_name = N'BackupDatabase', @schedule_name = N'NightlyJobs' ; GO 

J'espère que ce lien vous aidera. https://msdn.microsoft.com/fr-FR/library/ms191439.aspx

Vous pouvez utiliser sqlcmd pour sauvegarder une database. pour l'instance par défaut

 SqlCmd -E -S MyServer –Q “BACKUP DATABASE [MyDB] TO DISK='D:BackupsMyDB.bak'” 

pour une instance nommée

 SqlCmd -E -S MyServerMyInstance –Q “BACKUP DATABASE [MyDB] TO DISK='D:BackupsMyDB.bak'”