我会第一个承认我是黑客。我的代码看起来很糟糕,我相信还有更好的方法。请温柔一点。
我的目标是创建一个自动脚本来测试数据库的恢复,然后对所述数据库运行检查。第一步是在服务器上随机选择一个"用户"数据库。
我尝试过将这两个项都设置为字符串,甚至修剪得到的数据库名称,但没有成功。无论选择了什么数据库,都会通过检查。伙计们,我做错了什么?
感谢
#Get a count on the number of databases on the server
$db_count = sqlcmd -S localhost -d MASTER -h -1 -Q "SET NOCOUNT ON Select count(*) from sysdatabases"
# get a random number between 4 and the number of databases (system db's number 1-4)
$rand_db_num = Get-Random -Minimum 4 -Maximum $db_count
"Our random number is $rand_db_num"
# don't want these databases to be chosen
[string]$data = 'HOLDING','DBA','SSISDB','ReportServer','SQLDBA'
# Getting the database name that matches the random number
[string]$db_name = sqlcmd -S localhost -d Master -h -1 -Q "SET NOCOUNT ON Select name from sysdatabases where dbid = $rand_db_num"
#$db_name = $db_name.Trim()
"Checking to see what the number $rand_db_num database is: $db_name"
If ($db_name -icontains $data){
"chosen database name is $db_name"
}ELSE {
"Let's try this again"
}
在这方面你有一个非常好的开始,但你过于复杂了。数据库非常擅长对数据进行排序,并为你提供你想要的结果,所以直接在查询中限制数据库:
$query = "SET NOCOUNT ON SELECT name FROM sysdatabases WHERE name NOT IN ('master','tempdb','model','msdb','HOLDING','DBA','SSISDB','ReportServer','SQLDBA')"
$dbs = sqlcmd -S localhost -d MASTER -h -1 -Q $query
将该逻辑移动到查询中,只会给您想要的结果,从而真正简化了事情。因此,不再需要验证检查:
$db = Get-Random -InputObject $dbs -Count 1
$db