如何以编程方式比较SQL Server 2005中登录/用户的权限

问题描述:

SQL Server中有一个登录名/用户在导入生产服务器中的帐户时遇到问题。我不知道他在做什么。据一个导入,这个导入在开发服务器上工作正常。但是当他在生产中进行同样的进口时,却给他带来了错误。以下是他为每个帐户获得的错误。如何以编程方式比较SQL Server 2005中登录/用户的权限

2009-06-05 18:01:05.8254 ERROR [engine-1038] Task [1038:00001 - Members]: Step 1.0 [<Insert step description>]: Task.RunStep(): StoreRow has failed 
2009-06-05 18:01:05.9035 ERROR [engine-1038] Task [1038:00001 - Members]: Step 1.0 [<Insert step description>]: Task.RunStep(): StoreRow exception: Exception caught while storing Data. [Microsoft][ODBC SQL Server Driver][SQL Server]'ACCOUNT1' is not a valid login or you do not have permission. 

请注意'ACCOUNT1'不是真实的帐户名称。我出于安全考虑而改变了它。

使用SQL Server Management Studio(SSMS),我查看/检查了正在从开发服务器和生产执行导入的用户/登录的权限以进行比较。我发现没有区别。

我的问题是:有没有办法以编程方式查询特定登录名/用户的服务器和数据库级别的权限,以便我可以比较/对比任何差异?

红门的SQL比较会为你做。

您应该能够使用

sp_helplogins '<loginname>' 

请参阅MSDN参考here

此代码显示登录所拥有的所有权利。

select sys.schemas.name 'Schema', sys.objects.name Object, sys.database_principals.name username, sys.database_permissions.type permissions_type, 
    sys.database_permissions.permission_name, 
    sys.database_permissions.state permission_state, 
    sys.database_permissions.state_desc, 
    state_desc + ' ' + permission_name + ' on ['+ sys.schemas.name + '].[' + sys.objects.name + '] to [' + sys.database_principals.name + ']' COLLATE LATIN1_General_CI_AS 
from sys.database_permissions 
join sys.objects on sys.database_permissions.major_id = 
    sys.objects.object_id 
join sys.schemas on sys.objects.schema_id = sys.schemas.schema_id 
join sys.database_principals on sys.database_permissions.grantee_principal_id = 
    sys.database_principals.principal_id 
order by 1, 2, 3, 5 
+0

你应该加入到'sys.all_objects'和使用'离开join'贯穿始终,因为现在你丢失的数据库级别的权限和系统对象。 – ajeh 2017-08-15 18:17:15