web-dev-qa-db-ja.com

SQL Server 2014でDROP LOGINが失敗する

所有者「dbowner」のデータベースがあります。インストール手順では、ユーザー「dbowner」のログインを削除し、再度作成します。

他のバージョンのSQL Serverでは、次のSQLクエリが成功します。

USE [master]
DROP LOGIN 'dbowner'

SQL Server 2014では、同じクエリが次のエラーを返します。

ログイン 'dbowner'は1つ以上のデータベースを所有しています。ログインを削除する前に、データベースの所有者を変更してください。

これがSQL Server 2014で異なる理由を誰かが説明できますか?ログインの削除は、SQL Serverの他のすべてのバージョン(2005、2008、2012)で機能します。

SQL Server 2014で同じように機能させる設定はありますか?

更新:

Windowsユーザーを使用する例でこれを複製できます。何か案は?

CREATE LOGIN [comp\winuser] FROM WINDOWS;
GO
CREATE DATABASE mydb;
GO
ALTER AUTHORIZATION ON DATABASE::mydb TO [comp\winuser];
GO
DROP LOGIN [comp\winuser];
GO

アップデート2:

コメントしてくださってありがとうございます。所有者のログインを削除することは望ましくないことに同意します(ただし、SQL Server 2014を除くすべての場所でWindowsユーザーを使用できます)。しかし、私たちのインストールスクリプトは現在それに依存しており、非常に複雑なデータベースのインストール手順は15年前に彼によって作成されました(彼はもはや私たちと一緒に働いていません)。可能な限り変更しないことをおすすめします(機能する限り)。

ご覧のとおり、3つのオプションがあります。

  1. SQL 2014を以前のバージョンのように動作させ、スクリプトをそのままにしておきます。私たちはこのオプションを好み、これが可能かどうかを確認するためにここに投稿しました。
  2. 所有者を他のユーザーに変更し、所有者ログインをドロップして作成し、所有者を元に戻します。これはハックですが、うまくいくかもしれません。
  3. ユーザーの処理方法を変更し、所有者のログインのドロップを停止します。これは正しい方法ですが、最大の変更でもあります。
3
matjazr

SQL認証ログインの場合、これはSQL Server 2014でも以前のバージョンと同じです。私は2008年にこれをやった:

CREATE LOGIN dbowner WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO
CREATE DATABASE mydb;
GO
ALTER AUTHORIZATION ON DATABASE::mydb TO dbowner;
GO
DROP LOGIN dbowner;
GO

メッセージ15174、レベル16、状態1
ログイン 'dbowner'は1つ以上のデータベースを所有しています。ログインを削除する前に、データベースの所有者を変更してください。

これを行うまで、データベースをドロップできません。

ALTER AUTHORIZATION ON DATABASE::mydb TO sa;

Windows認証ログインの場合、Danが指摘したように、SQL Server 2014より前は、Windowsログインに対してこのチェックは実行されていなかったため、データベースの所有者を削除することにより、データベースを奇妙な状態のままにすることができました。 2番目のオプションは私にとって最良のように聞こえますが、それは上記の行をスクリプトに追加することを意味するだけです。別のオプションは、Windowsログインを所有者にしない(データベースで適切な権限を付与するのではなく、なぜ所有者にするのかわからない)か、プロセスの一部としてログインの削除を停止するか、またはその両方です。 。

6
Aaron Bertrand