2017-06-16 6 views
1

私は次のPowerShellスクリプトを使用して、データベース上で「このユーザーが所有するスキーマ」に変更しようとしている経由:変更MSSQLスキーマ所有PowerShellの

$dbname = "mydb" 
$sql_server = "mysqlserver" 
$username = "myuser" 

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

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server")($sql_server) 
$db = $server.Databases["$dbname"] 
$login = $server.Logins[$username] 
$roleName = "db_owner" 

if(-not $db.Users.Contains($login.Name)){ 
    $user = New-Object('Microsoft.SqlServer.Management.Smo.User') $db, $login.Name 
    $user.Login = $login.Name 
    $user.create(); 
} 

$user = $db.Users[$login.Name]  
$role = $db.Roles[$roleName] 
$role.AddMember($user.Name); 

$schema = $db.Schemas["dbo"] 
$schema.Owner = "myuser" 
$schema.Alter() 

私はステップの$ schema.Alterを取得( )次のエラーが表示されます。

Alterメソッドがより多くのパラメータを探しているような印象を受けますが、どのパラメータが必要なのかわかりません。私が間違ってやっていることは誰でも何か提案がありますか?

おかげで私の経験で ブラッド

+0

私はこれを大まかなガイドとして使用しています:https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/tasks/creating-altering-and-removing -schemas私は何が間違っているのか分かりませんか?私はこのようなことをしているようです。 – Brad

答えて

1

は、トップレベルの例外は有用ではありません。これに対処する私の典型的な方法は、$e = $error[0];のようなもので、$e.Exception$e.Exception.InnerException$e.Exception.InnerException.InnerException、... 実際にはというエラーになるまで呼びます。これはあなたの問題を解決するものではありませんが、少なくとも問題であることをよりよく理解することができます。

+0

良いアイデアだけど残念ながらそれ以上のことはありません。上記のエラーの他に、次の行が追加されました。Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。それはまだかなり曖昧です。 – Brad

+0

私が$ schemaを追加すると、所有者が変更されていることがわかります.Alter()は変更をコミットすべきですが、明らかに何かが正しくないと思います。 – Brad

+0

"曖昧なエラー"を修正してください。あなたは、問題の根本に達するまで(インセプションスタイル)、すべての道を行く必要があります。つまり、「Transact-SQL文やバッチを実行中に例外が発生しました」と思っています。 '$ e.Exception.InnerException'から取得します。 '$ e.Exception.InnerException.InnerException'はあなたに何を与えるのですか?理由のように見えるか、 '$ null'を返すまで、' InnerException'への呼び出しを続けてください。 –

関連する問題