我需要检查用户是否是db owner。
我找到了两种方法:
在您看来,哪个是最长期支持的方法? 我的意思是:微软是否更有可能将设计更改提交给系统表结构或存储过程语法/输出? 哪一个在SQL Server版本中最便携?
日Thnx
的Raf
答案 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.