DROP LOGIN 在 SQL Server 2014 上失败

mat*_*azr 3 security sql-server users logins sql-server-2014

我们有一个所有者为“dbowner”的数据库。我们的安装过程删除用户“dbowner”的登录名并重新创建它。

在任何其他版本的 SQL Server 上,以下 SQL 查询成功:

USE [master]
DROP LOGIN 'dbowner'
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2014 上,相同的查询返回以下错误:

登录 'dbowner' 拥有一个或多个数据库。在删除登录之前更改数据库的所有者。

谁能解释为什么这在 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
Run Code Online (Sandbox Code Playgroud)

更新 2:

谢谢您的意见。我同意删除所有者的登录名是不可取的(但除 SQL Server 2014 外,其他地方的 Windows 用户都可以使用)。然而,我们的安装脚本目前依赖于它,极其复杂的数据库安装过程是 15 年前某个人制作的(他不再与我们合作了)。如果可能(只要它有效),我们希望避免更改该领域。

在我看来,我们有三个选择:

  1. 使 SQL 2014 像以前的版本一样运行并保持脚本不变。我们更喜欢这个选项,我在这里发帖看看是否可以做到。
  2. 将所有者更改为其他用户,删除并创建所有者登录并将所有者移回。这是一个黑客,但可能会奏效。
  3. 改变我们处理用户的方式并停止放弃所有者的登录。这将是正确的方法,但也是最大的变化。

Aar*_*and 6

对于 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
Run Code Online (Sandbox Code Playgroud)

消息 15174,级别 16,状态 1
登录“dbowner”拥有一个或多个数据库。在删除登录之前更改数据库的所有者。

在执行以下操作之前,我无法删除数据库:

ALTER AUTHORIZATION ON DATABASE::mydb TO sa;
Run Code Online (Sandbox Code Playgroud)

对于 Windows 身份验证登录,正如 Dan 指出的那样,在 SQL Server 2014 之前,不会对 Windows 登录执行此检查,因此您可以通过删除其所有者来使数据库处于奇怪的状态。你的第二个选项对我来说听起来最好,它只意味着将上面的行添加到你的脚本中。另一种选择是不让 Windows 登录成为所有者(我不确定为什么要让他们成为所有者,而不是仅仅在数据库中赋予他们适当的权限),或者停止将登录作为过程的一部分,或者两者兼而有之.