用于检查用户的“db_owner”角色的长期支持方法

时间:2013-11-07 15:57:01

标签: sql sql-server stored-procedures system-tables

我需要检查用户是否是db owner。

我找到了两种方法:

  • 查看“exec sp_helprolemember”输出表
  • select count(*)from(select dbRole = g.name,MemberName = u.name,MemberSID = u.sid from sys.database_principals u,sys.database_principals g,sys.database_role_members m,其中g.principal_id = m。 role_principal_id和u.principal_id = m.member_principal_id和g.name ='db_owner')输出,其中MemberName ='user_to_be_checked'

在您看来,哪个是最长期支持的方法? 我的意思是:微软是否更有可能将设计更改提交给系统表结构或存储过程语法/输出? 哪一个在SQL Server版本中最便携?

日Thnx

的Raf

3 个答案:

答案 0 :(得分:2)

您列出的两种方法都不正确。

首先,检查db_owner会员资格总是不正确的。正确检查是对数据库的CONTROL权限,要使用的适当函数是HAS_PERM_BY_NAME()。这样可以避免您的应用程序因为应用程序使用不正确的检查(角色/组成员身份)拒绝与具有足够权限(CONTROL)的用户一起工作而感到尴尬。这实际上是在MSDN上明确调出的:

  

如果用户具有CONTROL DATABASE权限但不是db_owner角色的成员,则...将正确报告该用户不是db_owner角色的成员,即使该用户具有相同的权限

最后,如果您确实需要了解角色/组成员身份,则相应的功能是IS_MEMBER()

答案 1 :(得分:0)

我认为系统存储过程 - exec sp_helprolemember - 将是长期支持的方法。

我查看了exec sp_helprolemember的源代码,并在内部检查了您在第二种方法中所做的检查(不是逐字,但它还有其他条件)。

此外,使用Microsoft提供的系统存储过程是获取信息的推荐方法,除非他们现有的过程不能为您提供所需的所有信息。在这种情况下,您需要深入挖掘并针对系统表和函数编写自己的查询。

答案 2 :(得分:0)

我实际上不推荐。

对于目录视图选项,Microsoft说:

  

在SQL Server的未来版本中,Microsoft可能会扩充定义   通过将列添加到列的末尾来查看任何系统目录视图   名单。我们建议不要使用语法SELECT * FROM   生产代码中的sys.catalog_view_name因为列数   返回可能会改变并破坏您的申请。

我认为系统存储过程可能也是如此。

相反,我建议使用IS_ROLEMEMBER函数。例如:

SELECT IS_ROLEMEMBER('db_owner', 'user1');

如果为true则返回1,如果为false则返回0.

http://technet.microsoft.com/en-us/library/ee677633.aspx