检查表的权限

时间:2013-10-14 11:22:25

标签: sql-server-2012 database-permissions

我目前正在创建一个vb.net程序,需要检查一个表的权限(如果表不存在,那么数据库的权限,如果数据库不存在,那么对sql服务器的权限)

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

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

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

2 个答案:

答案 0 :(得分: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的权限。有关更多信息和示例,请参阅文档。

答案 1 :(得分:0)

我还能够组装另一个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

添加“use ReplaceWithNameOfDatabase”

查询将询问该数据库。

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

我找到了SQL Server: Permissions on table 为我工作,稍加修改