2012-03-27 8 views
0

現在SQL Server 2005を使用しており、数か月前からデータベースを復元しようとしていますが、アカウントを作成しようとすると復元すると、アカウントは既に存在していますが表示されませんそれは安全の下にある。私はそのアカウントを落とそうとしましたが、そのアカウントは存在しないと私に伝えます...しかし、私がそれを作成しようとすると、それは存在すると私に伝えます。私は完全にサーバーとすべてのリンクされたサーバーとすべてのデータベースからそのアカウントを削除し、私はそれが既に存在すると言うことを残して1を除いてすべてのデータベースで再び動作するように再作成しようとしました。それが何であるか、それ以外に何をチェックしなければならないのか?SQL Serverアカウントの問題

答えて

1

DBAとして、私はいつもこの問題を抱えています。 GUIはあまり役に立ちません。あなたのSQLサーバにはあなたが必要とするアカウントがあり、データベースには必要なアカウントがありますが、リストア時に自動接続しません。

この問題を解決する実際の方法は、個別アカウントを使用停止することです。アクティブなディレクトリグループのメンバーであることに基づいてのみ、DBへのアクセスを提供します。その後、ADグループにアクセスの問題を与えることができます。 BTW:個々のアカウントは復元時に自動再接続しませんが、グループアクセスは行いません。

私は同じ問題を解決するために使用するいくつかのコードを示します。

create procedure [dbo].[proc_FarSyncLogins] @TargetDB nvarchar(128)= '' as 
begin 
    SET NOCOUNT ON 

    declare @cmd varchar(1000) 

    begin try 
     drop table master.dbo.NeededUsers 
    end try 
    begin catch 
     print 'could not: drop table master.dbo.NeededUsers' 
    end catch 

    set @cmd='select name collate Latin1_General_CI_AS as name,is_disabled 
       into master.dbo.NeededUsers 
       from ['[email protected]+'].sys.sql_logins' 

    --print @cmd 
    exec(@cmd) 

    print 'logins that need to be enabled' 
    select * from master.dbo.NeededUsers 

    declare @UserName nvarchar(128) 
    declare SyncUsers1 cursor fast_forward for SELECT Name FROM master.dbo.NeededUsers 

    OPEN SyncUsers1 
    FETCH NEXT FROM SyncUsers1 INTO @UserName 
    WHILE @@FETCH_STATUS = 0 
     BEGIN 
      set @cmd = '' 
      if @TargetDB <> '' 
      begin 
       set @[email protected]+'Use ['[email protected]+']; '+char(10) 
      end 
      begin try 
       SET @cmd = @cmd+'ALTER LOGIN ['[email protected]+'] ENABLE; '+char(10) 
       SET @cmd = @cmd+'exec sp_change_users_login @Action=''Auto_Fix'', @UserNamePattern ='''[email protected]+'''; '+char(10) 
       PRINT @cmd 
       EXEC(@cmd) 
      end try 
      begin catch 
       Print 'Failed :'[email protected] 
      end catch 

      FETCH NEXT FROM SyncUsers1 INTO @UserName 
     END 
    CLOSE SyncUsers1 
    DEALLOCATE SyncUsers1 
end 

は、それからちょうど

exec master.dbo.proc_FarSyncLogins '<yourDBName>'; 

それはあなたがすべてのそれらのアクションを行うためのものを確認するために慎重に出力を読みたくなり、確定的にハックされています。しかし、ほとんどの場合、あなたが以前持っていたものすべてを元に戻したいだけです。

1

アカウントはデータベースとサーバーレベルに存在します。

データベース自体からアカウントを削除する必要がありますが、そこに存在しないため、サーバーから削除する必要はありません。 あなたは試してみました...

use {yourdatabasename} 
go 
EXEC sp_dropuser '{username}' 
+0

お返事ありがとうございます。うん、私はそれを試しても動作しません...まだユーザーには存在しないというエラーが表示されます。 –

+0

ここに表示されていますか?select * from sys.sysusers –

+0

そしてここでマスターを見ることができます。select * from sys.syslogins –

2

をあなたは、データベースに孤立したユーザー・アカウントを持っています。あるサーバーから別のサーバーにデータベースをコピー/移動するときは、非常に一般的な問題です。データベースユーザーから削除する必要があります。または、より良いオプションは、サーバーログインを作成し、そのログインをその孤立したデータベースユーザーとマッピングすることです。 私はmy blogにいくつかのデモスクリプトを書いていますが、それを見てみてください。または、孤児のユーザーを管理するために使用できるSPの使用についてはthis MSDN linkをご覧ください。