Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何通过vNEXT构建任务正确删除SQL Server数据库_Sql Server_Powershell_Tfs_Build_Vnext - Fatal编程技术网

Sql server 如何通过vNEXT构建任务正确删除SQL Server数据库

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

我们有一个用于测试机器的PowerShell清理脚本:

$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);
}