Sql server 如何通过vNEXT构建任务正确删除SQL Server数据库
我们有一个用于测试机器的PowerShell清理脚本:Sql server 如何通过vNEXT构建任务正确删除SQL Server数据库,sql-server,powershell,tfs,build,vnext,Sql Server,Powershell,Tfs,Build,Vnext,我们有一个用于测试机器的PowerShell清理脚本: $sqlConnection = new-object system.data.SqlClient.SqlConnection("Data Source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=master") try { $sqlConnection.Open() $commandText = @" exec sp_msforeach
$sqlConnection = new-object system.data.SqlClient.SqlConnection("Data Source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=master")
try {
$sqlConnection.Open()
$commandText = @"
exec sp_msforeachdb 'IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
drop database [?]
END'
"@
$sqlCommand = New-Object System.Data.SqlClient.SqlCommand
$sqlCommand.CommandText = $commandText
$sqlCommand.Connection = $sqlConnection
$SQLCommand.CommandTimeout = 0
$sqlCommand.ExecuteNonQuery()
}
finally{
$sqlConnection.Close()
}
正常情况下,它可以工作,但有时无法删除数据库,因为似乎存在一些打开的连接,而构建任务无法删除正在使用的数据库
这似乎也发生在“某个点”或“随机点”
有什么建议可以改进脚本吗
(在prem和SQL Server 2014上使用最新的TFS 2017)如果需要在没有警告的情况下切断所有用户,请在删除数据库之前将其设置为脱机
$commandText = @"
exec sp_msforeachdb 'IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
alter database [?] set offline with rollback immediate;drop database [?];
END';
"@
如果在此处找到脚本:
它按预期工作,仍然感谢您的帮助我可以建议使用SMO吗
push-location;
import-module sqlps -disablenamechecking;
pop-location
$serverName = '.';
$server = new-object microsoft.sqlserver.management.smo.server $servername;
foreach ($db in $server.Databases | where {$_.IsSystemObject -eq $false}) {
$server.killDatabase($db.Name);
}
感谢您的帮助,但如果总是失败,请务必执行以下操作:(
使用“0”参数调用“ExecuteOnQuery”时发生异常):“无法在数据库“master”中设置选项“OFFLINE”。无法在数据库“tempdb”中设置选项“OFFLINE”。无法在数据库“model”中设置选项“OFFLINE”。无法在数据库“msdb”中设置选项“OFFLINE”。”在第18行char:5+$sqlCommand.ExecuteNonQuery()++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+CategoryInfo:NotSpecified:(:)[],MethodInvocationException+FullyQualifiedErrorId:SqlException
)是否使用if
语句运行此操作?我将修改我的帖子,以显示完整的$commandtext
ok我测试了几个场景。它以某种方式工作,它将数据库从ManagementStudio中删除,但文件仍然物理地存在于DATA文件夹中,尽管出现了错误。我认为SQL服务仍然可以查看任何数据库。尝试了不同的方法。
push-location;
import-module sqlps -disablenamechecking;
pop-location
$serverName = '.';
$server = new-object microsoft.sqlserver.management.smo.server $servername;
foreach ($db in $server.Databases | where {$_.IsSystemObject -eq $false}) {
$server.killDatabase($db.Name);
}