iKi*_*tra 6 sql-server permissions users
我从我的一位客户那里收到了一份数据库备份,现在我正在尝试将其恢复到我的系统中。
我试图在谷歌上搜索这个问题并尝试了大部分建议的解决方案,但没有一个有效。任何人都可以在恢复数据库后为这个错误提出一些具体的解决方案吗?
提前致谢!
还原数据库时,它包含数据库用户。每当您执行备份和还原到不同的 SQL Server 时,这些用户都会与数据库一起传输。
在您的源和目标 SQL Server 上,您将拥有SQL Server 登录名。这些登录名要么是 SQL Server 帐户(本机 SQL Server 登录名),要么是 Windows Server/域帐户(Windows 帐户)。
SQL Server 登录名(本机 SQL 登录名或 Windows 帐户)存储在 master 数据库中,并为每个 SQL 登录名分配了唯一的 SID。您可以在查询系统目录视图时检索 SQL Server 登录名列表sys.server_principals
。
select * from sys.server_principals
Run Code Online (Sandbox Code Playgroud)
您将收到 SQL Server 实例的 SQL Server 登录名列表。
注意:这些是 SQL Server 登录名,而不是数据库用户。
可以sys.database_principles
通过发出以下查询查询每个用户数据库的系统目录视图来查询数据库用户:
USE [<your_db>]
GO
SELECT * FROM sys.database_principals
Run Code Online (Sandbox Code Playgroud)
您将收到被分配了数据库权限的数据库用户列表。
注意:这些是数据库用户而不是 SQL Server 登录名。
当您创建一个数据库并为该数据库分配一个具有特定权限的“用户”时,您实际上正在执行以下操作(部分在后台):
sys.server_principal
)创建 SQL Server 登录sys.database_principal
)在这种情况下,SQL 登录 ( sys.server_principal
) 的 SID 将与数据库用户 ( sys.database_principal
)的 SID 匹配。
从源 SQL Server 还原数据库时,源数据库中的数据库用户(仅限本机 SQL Server 登录名和本地 Windows 帐户)与目标服务器上的SQL Server 登录名具有不同的 SID 。这是因为源和目标本机 SQL Server 登录名或本地 Windows 帐户的 SID 是唯一的。
基于 Windows 域帐户的 SQL Server 登录将始终具有相同的 SID,因为 SQL Server 将从 Active Directory 检索这些值。
当您将数据库从源 SQL Server 还原到目标 SQL Server 时,本机 SQL Server 登录名的 SID 将不匹配,即使用户可能列在sys.server_principals
SQL Server 实例的sys.database_principals
系统管理目录和恢复的数据库。
要纠正此问题并允许您导航“SQL Server 登录|权限”和/或“数据库属性|权限”,您可以将这些孤立的数据库用户重新链接到 SQL Server 登录。
切换到您的用户数据库并查询孤立的数据库用户:
USE [your_db]
GO
sp_change_users_login 'Report'
Run Code Online (Sandbox Code Playgroud)
如果用户被报告为孤立用户,您可以通过发出以下命令将SQL Server 登录名与数据库用户重新链接:
USE [your_db]
GO
sp_change_users_lgoin 'Update_one', '<database_user>', '<sql_server_login>'
Run Code Online (Sandbox Code Playgroud)
这会将sys.server_principal
目标实例上的(本机)SQL Server 登录名 ( ) 与sys.database_principal
还原的数据库的数据库用户 ( )重新链接。
看到 assp_change_users_login
已被弃用,您可以使用以下ALTER USER
语句实现相同的效果:
USE [<your_db>]
GO
ALTER USER <database_user>
WITH LOGIN = <sql_server_login>
Run Code Online (Sandbox Code Playgroud)
...当您从客户端收到数据库备份时,您可能没有相应的 SQL Server 登录名来链接到数据库用户。在这种情况下,您可以创建 SQL Server 登录名,而无需为恢复的数据库分配权限,然后使用上述语句将新创建的 SQL Server 登录名与数据库用户关联。
您收到的错误源自 SSMS 对话框(在您的图片上)启动的代码。
当您通过该对话框向服务器询问某个用户的有效权限时,服务器会尝试模拟所选用户,即当您单击 时test_user
,effective permissions
它启动的代码如下:
EXECUTE AS USER = N'test_user';
SELECT
permission_name AS [Permission]
FROM fn_my_permissions(N'[yourDB]', N'DATABASE')
ORDER BY permission_name;
REVERT;
Run Code Online (Sandbox Code Playgroud)
这是为了在未登录的情况下创建用户 (test_user) 的情况。
如果用户有相应的登录名,服务器会尝试模拟相应的登录名,因为在登录名 = win 组的情况下它可能对应于更多用户。
例如,在其他情况下,用户是从创建的certificate
,但我现在无法监视在这种情况下执行的代码。
要了解您的情况下服务器执行了哪些代码,只需使用 SQL Server Profiler,您将了解它尝试模拟的内容并找到错误原因。
我知道如何在 Windows 组的特定情况下收到此错误:因为它无法被模拟,所以您会得到该错误。
其他可能的原因:您可能缺乏模拟该用户的权限。您正在执行代码吗sysadmin
?如果没有,这可能就是你的情况
更新
我刚才能够重现它。 如果您尝试模拟那些与恢复的数据库一起移植到另一台服务器的孤立用户,则会产生相同的错误。
如果您的孤立用户存在同名的现有登录名(但具有不同的 sid),您可以通过执行以下代码来修复此问题:
alter user test_user with login = test_user
Run Code Online (Sandbox Code Playgroud)
如果您没有相应的登录名,您可以使用相同的 sid 重新创建它,或者像我上面那样创建一个新的登录名并更新现有用户。
如果您根本不需要该用户,请将其删除
归档时间: |
|
查看次数: |
28559 次 |
最近记录: |