1

我目前正在制作一个需要检查表权限的vb.net程序(如果表不存在,则对数据库的权限,如果数据库不存在,则对sql server的权限)

有没有办法检查 thouse 权限,以及如何?

  • 如何检查用户“testuser”对表“testdb.testtable”的权限
  • 如何检查用户“testuser”对数据库“testdb”的权限
  • 如何检查服务器上用户“testuser”的权限

我一直在谷歌上搜索,但我得到的结果是一个 2 页长的 sql 脚本。

4

2 回答 2

1

我还能够组装另一个 SQL 查询。但是,如果用户无权访问数据库,这将返回错误。

SELECT pe.*,object_name(pe.major_id), pr1.name as Grantee, pr2.name as Grantor, pr1.create_date,pr1.default_schema_name  from sys.database_permissions as pe
join sys.database_principals as pr1 on pe.grantee_principal_id = pr1.principal_id 
join sys.database_principals as pr2 on pe.grantor_principal_id = pr2.principal_id
where pr1.name = CURRENT_USER 
go

通过添加“使用 ReplaceWithNameOfDatabase”

查询将询问该数据库。

我以前从来没有真正使用过 MSSQL,只有 MYSQL,而且用户登录数据的存储方式似乎有很多很大的差异。

我发现这个SQL Server: Permissions on table 对我有用,稍作修改

于 2013-10-17T10:40:25.873 回答
1

我会将创建数据库的责任推给最终用户——并允许用户指定该数据库;安装程序创建数据库可能是有效的,但它也应该接受已经创建的数据库,其中名称已由最终用户提供。您不想假设一个数据库名称,就好像最终用户已经使用该名称创建了一个数据库,您将与它直接冲突。

也就是说,权限存储在sys.database_permissions其中概述用户在数据库中的权限,从中查询并sys.server_permissions确定他们是否有能力创建数据库。

尽管 SQL Server 有一个包含查询权限的函数,但很有帮助 - 该HAS_PERMS_BY_NAME函数在这里派上用场,例如:

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE')

...将查看当前用户是否有能力在命名数据库中“创建表”,同时

SELECT HAS_PERMS_BY_NAME(null, null, 'CREATE ANY DATABASE')

...会告诉你当前用户是否可以创建数据库。权限的名称是您要传递给GRANT. 有关更多信息和示例,请参阅文档。

于 2013-10-15T18:45:13.203 回答