web-dev-qa-db-ja.com

データベースユーザーとSQL Serverログインの間のリンクを解除する

あるインスタンスから別のインスタンスにデータベースを復元するとき、SQL Serverログインをデータベースユーザーに再リンクする必要がある場合があります。

これは通常、次のいずれかの手順で実行されます。

非推奨のsp_change_users_loginストアドプロシージャ

use <database>
go
sp_change_users_login 'Update_one', '<datbase_user>', '<sql server login>' 
go

ALTER USERコマンド

use <database>
go
ALTER USER [<datbase_user>] WITH LOGIN = [<sql server login>]
go

これらのコマンドは、孤立したデータベースユーザーを対応するSQL Serverログインに再リンクします。

質問

SQL Serverログインまたはデータベースユーザーを削除せずにこの関係を解除することはできますか?

理由

  • データベースユーザーを削除すると、データベースの権限が削除されます。
  • SQL Serverログインを削除すると、パスワードも削除されます。 (ハッシュ値; DBAには不明)
  • WindowsシステムアカウントであるSQL Serverログインにデータベースユーザーをリンクしました。

研究

sys.database_principalsおよびsys.server_principals DMV、ただし変更はできません。

10

これは、一時的なログインを作成し、ユーザーを一時的なログインに再マップして、一時的なログインを削除するという、遠回りの方法で実現できます。 SQLログインの場合:

USE [master]
CREATE LOGIN [temp_user] WITH PASSWORD=N'asdf' MUST_CHANGE, 
    DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
ALTER LOGIN [temp_user] DISABLE

USE [test_database]
ALTER USER test_user WITH LOGIN = [temp_user]
DROP LOGIN [temp_user]

Windows認証ログイン/ユーザーの場合、一時的なWindowsアカウントを作成してから削除する必要があるため、100%T-SQLソリューションではありません。

-- Create a Windows account with a name of Temp_User
USE [master]
CREATE LOGIN [COMPUTERNAME\Temp_User] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
ALTER LOGIN [COMPUTERNAME\Temp_User] DISABLE

USE [test]
ALTER USER [COMPUTERNAME\Existing_User] WITH LOGIN = [COMPUTERNAME\Temp_User]
--Delete the Temp_User Windows account
8
Tony Hinkle

Tonyの答えは最初はかなり近いものでしたが、ネイティブSQL Serverログインでのみ機能し、Windows Authenticated SQL Serverログインでは機能しませんでした。ただし、一般的な考え方は同じです。

  1. ローカルサーバーにWindowsアカウントを作成します。

     C:\> Net User <account> /ADD
    
  2. Windows認証済みのSQL Serverログインを作成します。

    USE [master]
    GO
    CREATE LOGIN [<server>\<account>] FROM WINDOWS WITH DEFAULT_DATABASE = [master]  
    GO
    
  3. 問題のデータベースに切り替え、Windows Authenticated SQL Serverログインを目的のデータベースユーザーにリンクします。

    注意:この手順では、現在使用しているデータベースの[<database_user>]の名前をWindowsの認証済みSQL Serverログイン名[<server>\<account>]に変更します。名前を書き留めて、名前を元に戻すことができるようにします。

    USE [<database>]
    GO
    ALTER USER [<database_user>] WITH LOGIN = [<server>\<account>]
    GO
    
  4. 以前に作成したWindows認証SQL Serverログインを削除します。

    USE [master]
    GO
    DROP LOGIN [<servername>\<account>]
    GO
    
  5. 手順3で名前を変更したデータベースユーザーの名前を以前の名前に変更します。

    USE [<database>]
    GO
    ALTER USER [<servername>\<account>] WITH NAME = [<database_user>]
    GO
    
  6. この目的で作成されたローカルアカウントを削除します。

     C:\> Net User <account> /DELETE
    

これらの手順を実行した後、[<database_user>]はWindows認証のSQL Serverログインにリンクされなくなります。

ご注意ください
このソリューションには、1つの大きな注意点があります。 Windows認証済みSQL ServerログインをSQL Serverから実際に削除できず、新しいローカル<account>を作成して再マップして削除する必要がある場合は、データベースユーザーのSIDがデータベースで変更され、操作。

7