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 年前某个人制作的(他不再与我们合作了)。如果可能(只要它有效),我们希望避免更改该领域。
在我看来,我们有三个选择:
对于 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 登录成为所有者(我不确定为什么要让他们成为所有者,而不是仅仅在数据库中赋予他们适当的权限),或者停止将登录作为过程的一部分,或者两者兼而有之.
| 归档时间: |
|
| 查看次数: |
7702 次 |
| 最近记录: |