0

我需要检查用户是否是数据库所有者。

我找到了两种方法:

  • 查看“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 版本最可移植的?

谢谢

皇家空军

4

3 回答 3

2

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

首先,检查成员资格总是不正确的db_owner。正确的检查是对数据库的 CONTROL 权限,并且要使用的适当函数是HAS_PERM_BY_NAME(). 这将使您免于因应用程序使用不正确的检查(角色/组成员资格)而拒绝与具有足够权限 (CONTROL) 的用户合作的尴尬。这实际上是在MSDN上明确指出的:

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

最后,如果您真的需要知道角色/组成员资格,那么适当的功能是IS_MEMBER()

于 2013-11-07T16:10:38.250 回答
0

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

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

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

于 2013-11-07T16:06:31.287 回答
0

我实际上都不推荐。

对于目录视图选项,微软表示:

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

我相信系统存储过程也是如此。

相反,我建议使用该IS_ROLEMEMBER功能。例如:

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

如果为真则返回 1,如果为假则返回 0。

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

于 2013-11-07T16:07:41.380 回答