0

マスター データベースを引き継ぐことなく、データベースを 1 つのインスタンスから新しいインスタンスに復元した状況があります。その結果、すべてのセキュリティ情報が失われます。奇妙なことに、クライアントは引き続き信頼できる接続を介してデータにアクセスできますが、ユーザー ID の管理を行おうとすると、アカウントがスキーマの所有者であると表示されるため、アカウントを削除できません。ユーザー データベースでは、同じ名前のほぼすべてのユーザー アカウントのスキーマの長いリストを取得できます。sys.schema のダンプは、これらのユーザー スキーマが存在しないことを示しています (明らかに、それらは元のインスタンスのマスター データベースにはありましたが、新しいデータベースにはありませんでした)。スキーマが存在しないため、ユーザー ID が存在しないエンティティを非所有にして、それを削除できるようにするにはどうすればよいでしょうか?

132 人のユーザーに対してこれを行う必要があるため、反復スクリプトも探しています。このサイトの調査によると、所有者を dbo に変更するスクリプトを見ましたが、その状況ではスキーマが存在していました。私の状況ではそうではありません。どんな助けでも大歓迎です。

4

1 に答える 1

1

次の 2 つのいずれかが発生している可能性があります。

  1. sys.schemas別のデータベースにチェックインしている可能性があります。スキーマはターゲット データベースに存在する可能性がありますが、 から選択しているsys.schemas場合masterは、異なる結果が得られます。
  2. スキーマは、スキーマを所有するデータベース ユーザーと同じ名前である必要はありません。

これをクリーンアップするには、次のコード/アプローチを使用します。

ユーザー名の .txt ファイルを作成し、各ユーザーを別の行に記述します。

次の SQL コードを使用します。

use [copied_db];

CREATE TABLE #users
(uname varchar(100));

BULK INSERT #users FROM 'C:\test\users.txt';

SELECT 'DROP SCHEMA ' + QUOTENAME(s.name,'[') + ';'
FROM #users u
    JOIN sys.database_principals dp ON (u.uname = dp.name)
    JOIN sys.schemas s ON (dp.principal_id = s.principal_id);

SELECT 'DROP USER ' + QUOTENAME(dp.name,'[') + ';'
FROM #users u
    JOIN sys.database_principals dp ON (u.uname = dp.name);

このコードは、個々のアクションのドロップ ステートメントを提供するので、自由に実行できます。

于 2013-02-11T22:29:58.953 に答える