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 2008 powershell脚本的数据库架构所有者问题_Sql Server 2008_Powershell - Fatal编程技术网

Sql server 2008 powershell脚本的数据库架构所有者问题

Sql server 2008 powershell脚本的数据库架构所有者问题,sql-server-2008,powershell,Sql Server 2008,Powershell,我正在学习powershell脚本,并编写了一个简单的脚本,用于从备份文件还原sql数据库。恢复工作得很好,但是现在我需要脚本从新恢复的数据库中删除几个用户并将其添加回数据库。如果他们没有被列为该特定数据库中任何模式的所有者,那么这是没有问题的 我遇到的问题是,如果它们被列为模式所有者,那么我的脚本将抛出此异常 Exception calling "Drop" with "0" argument(s): "Drop failed for User 'MyUser'. " At line:1 ch

我正在学习powershell脚本,并编写了一个简单的脚本,用于从备份文件还原sql数据库。恢复工作得很好,但是现在我需要脚本从新恢复的数据库中删除几个用户并将其添加回数据库。如果他们没有被列为该特定数据库中任何模式的所有者,那么这是没有问题的

我遇到的问题是,如果它们被列为模式所有者,那么我的脚本将抛出此异常

Exception calling "Drop" with "0" argument(s): "Drop failed for User 'MyUser'. "
At line:1 char:1
+ $user.Drop()
+ ~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FailedOperationException
我尝试过用这段代码将模式的所有者更改为dbo,但仍然得到了异常。奇怪的是,如果我在更改所有者后在powershell中检查架构详细信息,我确实会将所有者视为dbo,但如果我在sql server management studio中检查架构所有者,即使刷新了DB,所有者仍然是旧所有者

PS E:\MyScripts> $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)"
PS E:\MyScripts> $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)"
PS E:\MyScripts> $db = $server.Databases["MyDB"]
PS E:\MyScripts> $sch = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Schema -argumentlist $db, "MySchema"
PS E:\MyScripts> $sch.Owner = "[dbo]"
整个脚本看起来像这样

#load assemblies
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

#Need SmoExtended for backup
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)"

$db = $server.Databases["MyDB"];
$user = $db.Users["MyUser"];
$sch = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Schema -argumentlist $db, "MySchema"
$sch.Owner = "[dbo]";
$user.Drop();
对我有效的解决方案 在使用了脚本和下面的建议之后,我发现问题在于在更新所有者之后,我没有对模式调用.Alter()。最初使用.Alter()时我遇到了一些问题,因为我试图为数据库架构创建一个“新对象”,而这个“新对象”已经存在。所以我的解决办法是

PS E:\MyScripts> [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
PS E:\MyScripts>
PS E:\MyScripts> [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
PS E:\MyScripts> [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
PS E:\MyScripts> [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null
PS E:\MyScripts>
PS E:\MyScripts> $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)"
PS E:\MyScripts> $db = $server.Databases["MyDB"]
PS E:\MyScripts> $db = $server.Databases["MyExistingSchema"]
PS E:\MyScripts> $db.Schemas["Cadence"].Owner = "MyUser"
PS E:\MyScripts> $db.Schemas["Cadence"].Alter()

设置新所有者后,尝试对$sch对象调用alter方法:

$sch.Owner = "[dbo]"
$sch.Alter()

将拥有的架构从一个用户更改为另一个用户

$srv = new-object ('Microsoft.SqlServer.Management.Smo.Server') $servername
$database = $srv.Databases[$dbname]
$sch = $database.Schemas["db_owner"]
$sch.Owner = "dbo"
$sch.Alter()

调用带有“0”参数的“Alter”时发生异常:“'MySchema'架构的Alter失败”。在E:\MyScripts\AddDBLogins.ps1:94 char:1+$sch.Alter()++~~~~~~~~~~~~~~~~~~~~+CategoryInfo:NotSpecified:(:)[],MethodInvocationException+FullyQualifiedErrorId:FailedOperationException
我在发布问题后发现了这个问题,然而,这似乎是在添加一个新的模式,而不是改变一个新的模式。即使在尝试按照文档行中的示例,我也会得到与上面相同的错误。更正,我刚刚断开了与sql server management studio的连接,重新运行了一行又一行的文档脚本,它起了作用,因此我认为这与架构上的权限问题以及访问它的本地用户有关。谢谢Chad,我给了你答案,因为你为我指明了正确的方向,你是正确的,我需要使用.Alter()。在我最初的问题中,我完整地解释了对我有用的东西。