我们可以通过sp_helprotect在特定的数据库中获取权限。然后如何获取特定数据库的权限,例如master或tempdb
我尝试过下面这句话:
SELECT major_id, minor_id, grantor_principal_id, grantee_principal_id, permission_name, pr1.name as GRANTEE, pr2.name as GRANTOR, pr2.create_date, pr2.modify_date
FROM (SELECT * FROM sys.database_permissions where class = 4) 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但是主要的id是0,所以我不能得到存在于哪个对象上的权限。
发布于 2016-10-31 17:52:08
适用于sys.database_permissions的MSDN声明:
为数据库中的每个权限或列例外权限返回一行。对于列,与对应的对象级权限不同的每个权限都有一行。如果列权限与对应的object权限相同,则不再有行,实际使用的权限为object的权限。
因此,这意味着您的查询将只返回运行它的数据库上下文的权限。但是,您当前正在做的是使用Database Principal(查询的class = 4部分)上存在的权限进行过滤。如果您需要数据库对象(如表、存储过程等),则还应在类WHERE子句中包含1。
编辑1:要获得tempdb或master的权限,您可以运行查询两次,使用:
USE master;
GO
/* Your query here that will return the permissions for master */
USE tempdb;
GO
/* Your query here that will return the permissions for master */编辑2:如果你想要一个查询,你可以使用这个:
SELECT major_id, minor_id, grantor_principal_id, grantee_principal_id, permission_name, pr1.name as GRANTEE, pr2.name as GRANTOR, pr2.create_date, pr2.modify_date , 'master' as db
FROM
(SELECT * FROM master.sys.database_permissions where class = 4) as pe
INNER JOIN master.sys.database_principals AS pr1
ON pe.grantee_principal_id = pr1.principal_id
INNER JOIN master.sys.database_principals AS pr2
ON pe.grantor_principal_id = pr2.principal_id
UNION ALL
SELECT major_id, minor_id, grantor_principal_id, grantee_principal_id, permission_name, pr1.name as GRANTEE, pr2.name as GRANTOR, pr2.create_date, pr2.modify_date , 'tempdb' as db
FROM
(SELECT * FROM tempdb.sys.database_permissions where class = 4) as pe
INNER JOIN tempdb.sys.database_principals AS pr1
ON pe.grantee_principal_id = pr1.principal_id
INNER JOIN tempdb.sys.database_principals AS pr2
ON pe.grantor_principal_id = pr2.principal_id;https://stackoverflow.com/questions/40339632
复制相似问题