是否可以比较两个用户对一个 SQL Server 数据库的权限?
有什么简单的查询可以做到吗?
我问这个是因为我想知道用户 B 在数据库上是否与用户 A 具有不同或相同级别的权限。
我们有一台新的 Windows 2016 服务器,我必须安装 SQL Server 2016 标准版。安装和配置 SQL 服务器后,我会将现有的生产数据库移动到新的数据库服务器。
我可以远程桌面访问服务器以安装 SQL 服务器,但不确定是否需要域服务帐户?我的印象是 SQL 服务器在安装过程中分配的默认服务就足够了。
问题 1:
DB Admin 团队将远程桌面连接到该服务器并使用 SSMS 连接到 SQL 服务器,而不是从他们的本地 SSMS。在这种情况下,我是否必须拥有域服务帐户?
问题2:
DB支持的应用程序将有几百个用户通过网络连接?在这种情况下,默认服务帐户就足够了,还是我必须拥有域服务帐户?
我是数据库管理领域的新手,所以我仍然在为几个概念苦苦挣扎。
我正在根据这篇 MSDN 文章的指导创建一个 Microsoft SQL 服务器用户,并向系统提供以下命令:
CREATE LOGIN MyName WITH PASSWORD = 'MyPass';
使用我的$DatabaseName;
CREATE USER MyName FOR LOGIN MyName;
走
我使用 SQL Studio 通过单击Logins列表中的名称再次查看密码。在那里我看到密码上的星号太多了,它可能代表我给定的密码。
我的问题是,如果我根据我写的(纯文本)提供密码,我是否正确提供了密码?我在登录数据库时遇到问题,我现在不知道那里的密码是否正确。
(MSDN 上的链接没有说明任何关于加密的内容,但我不能说示例密码是否遵循某些加密规则。)
我删除了 SQL Server Windows登录。然后我运行下面的代码来检查孤立的数据库用户。但是,与删除的 Windows 登录对应的数据库用户不会显示为孤立用户。
为什么会这样?
EXEC sp_change_users_login @Action = 'Report';
Run Code Online (Sandbox Code Playgroud) 我正在使用 MySQL 5.6,我试图为特定数据库创建一个超级用户,但我得到了
ERROR 1396 (HY000): Operation CREATE USER failed for 'superuser'@'%'
Run Code Online (Sandbox Code Playgroud)
然后我想也许已经有一个用户名和密码相同。我刷新了权限并运行以下查询:
grant all privileges on db1.* to 'superuser'@'localhost'
Run Code Online (Sandbox Code Playgroud)
在该查询之后,我得到:ERROR 2013 (HY000): Lost connection to MySQL server during query
并且 MySQL 服务停止工作。
我们有一个所有者为“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 年前某个人制作的(他不再与我们合作了)。如果可能(只要它有效),我们希望避免更改该领域。
在我看来,我们有三个选择:
我需要一个用户能够从机器 foobarhost,IP 10.11.12.13 登录我们的 MySQL 服务器 5.6。
因此我创建了一个用户,'joe'@'foobarhost'但他无法登录。我必须创建一个用户'joe'@'10.11.12.13',这次工作正常。
我的问题:MySQL 如何处理有关用户的主机名和 IP 地址?
MySQL在检查匹配之前对用户表进行排序,使用 IP 地址和主机名作为要匹配的最具体的值。但是,文档没有指定优先级 - 主机名或 IP。MySQL 是否尝试主机名解析,如果失败,则对 IP 执行检查?
用户表的推荐用法是什么:仅指定 IP 地址、主机名或两者(如我在上面的示例中所做的那样)?
假设在 postgres 9.6 中创建了一个具有某些特定权限集的用户:
CREATE USER foo_user WITH ENCRYPTED PASSWORD 'foo_password';
GRANT CONNECT ON DATABASE bar_db TO foo_user;
GRANT USAGE ON SCHEMA public TO foo_user;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO foo_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public to foo_user;
Run Code Online (Sandbox Code Playgroud)
(从这里复制并修改。)
如果该用户是在主数据库上创建的,并且有一个与WAL 流复制同步的关注者,那么该用户是否会自动在关注者上创建一个具有相同权限集的用户?
看起来答案是肯定的,因为用户和权限是用表表示的,并且这些特殊表可能与任何其他预写日志记录表一样对待。但我无法在任何这些文档页面中 确认这一点。可以证实或揭穿我的想法吗?最好向我指出一些我似乎找不到的相关文档?
我们有两个数据库,Adb和Bdb. 在Bdb,我们创建了一个观点,即引用另一种观点认为Adb,像这样:CREATE VIEW Bdb.dbo.Bview AS SELECT * FROM Adb.dbo.Aview。
我们有一个 SQL Authenticated Blogin,映射到Buser,Adb和Bdb,至少db_datareader在两者上都有角色。
以下不起作用:
USE Bdb;
EXECUTE AS USER = 'Buser';
SELECT * FROM Bdb.dbo.Bview;
SELECT * FROM Adb.dbo.Aview;
Run Code Online (Sandbox Code Playgroud)
两个选择都会引发以下错误:
Msg 916, Level 14, State 1, Line 4
The server principal "Buser" is not able to access the database "Adb" under the current security context.
Run Code Online (Sandbox Code Playgroud)
但是,这有效:
USE Adb;
EXECUTE AS USER …Run Code Online (Sandbox Code Playgroud) 我想找到特定用户在一段时间内在数据库中执行的所有查询。
我了解了跟踪和 XEvents,但这些尚未设置,我仍然能够获取特定用户执行的查询吗?
users ×10
sql-server ×6
permissions ×3
logins ×2
mysql ×2
log ×1
mysql-5.5 ×1
mysql-5.6 ×1
password ×1
postgresql ×1
replication ×1
security ×1
trace ×1