我目前正在创建一个vb.net程序,需要检查一个表的权限(如果表不存在,那么数据库的权限,如果数据库不存在,那么对sql服务器的权限)
有没有办法检查thouse权限,以及如何?
我一直在google上搜索,但我得到的结果是一个2页长的sql脚本。
答案 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 为我工作,稍加修改