Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2012 检查表的权限_Sql Server 2012_Database Permissions - Fatal编程技术网

Sql server 2012 检查表的权限

Sql server 2012 检查表的权限,sql-server-2012,database-permissions,Sql Server 2012,Database Permissions,我目前正在制作一个vb.net程序,需要检查表的权限(如果表不存在,则检查对数据库的权限;如果数据库不存在,则检查对sql server的权限) 有没有办法检查house权限,以及如何检查 我如何检查“testdb.testtable”表上的权限 用户“testuser” 如何检查数据库“testdb”的权限 用户“testuser” 如何检查用户“testuser”在服务器上的权限 我一直在谷歌上搜索,但得到的结果是一个2页长的sql脚本。我将把创建数据库的责任推给最终用户,并允许用户指定

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

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

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

我一直在谷歌上搜索,但得到的结果是一个2页长的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
尽管SQL Server有一个功能可以包装查询权限,但它还是很有用的,例如:

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE')
…将查看当前用户是否能够在命名数据库中“创建表”,同时

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

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

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

查询将针对该数据库进行查询

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
我以前从未真正使用过MSSQL,只使用过MYSQL,而且在用户登录数据的存储方式上似乎有很多不同之处

我找到了这个
为我工作,稍加修改

我想这里的另一个问题是“为什么”?如果您没有权限,是否需要执行特定的操作?如果您需要做的只是显示一个适当的错误,那么只需尝试对
testdb.testtable
表执行您需要执行的任何操作,SQL就会抛出一个错误,以及一个准确的错误消息和错误号(您可以切换()),并解决问题。我的想法是检查该表是否存在,如果存在,并且您具有插入权限,开始插入新行。但是,如果该表不存在,则在用户有权更改数据库的情况下创建该表。如果数据库不存在,则在用户有权创建新数据库的情况下创建数据库。这主要是为了在开始发布数据之前,将其作为一种初始尝试,以防止数据丢失。这看起来与我得出的结论相同。我之所以需要记录数据库用户的权限,是因为这是我提供的一项windows服务,如果它失败了,我认为最终用户需要详细了解出了什么问题,以减轻挫折感。谢谢你的例子