patternsqlMinor
script to show all the permissions for a table
Viewed 0 times
scriptshowpermissionstheallfortable
Problem
inside my database I have a procedure called spGen2_tblIE_SchedProcess_Update.
when I run this script
Inside the same database I have a table called tblIE_Step
when I run the following script
then I want to see all the permissions of the objects.
when I check my stored procedure
I run this script:
and I get the permissions:
But when I run the same for my table, I don't get anything:
I know there are logins and groups that belong to roles that are have db_reader and db_writer permissions.
However, they are not showing here.
How can I change my script so that it would show me all the permissions for this table?
when I run this script
select * from sys.objects
where name = 'spGen2_tblIE_SchedProcess_Update'Inside the same database I have a table called tblIE_Step
when I run the following script
select * from sys.objects
where name = 'tblIE_Step'then I want to see all the permissions of the objects.
when I check my stored procedure
I run this script:
select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
, 'Type' = per.state_desc, 'Permission' = per.permission_name
, 'Login' = pri.name, 'Type' = pri.type_desc
, *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 87671360and I get the permissions:
But when I run the same for my table, I don't get anything:
select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
, 'Type' = per.state_desc
, 'Permission' = per.permission_name
, 'Login' = pri.name, 'Type' = pri.type_desc
, *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 389576426I know there are logins and groups that belong to roles that are have db_reader and db_writer permissions.
However, they are not showing here.
How can I change my script so that it would show me all the permissions for this table?
Solution
I found a good script to see the permissions on a database object.
the script above works for a database object.
however,
when I add permissions on the schema where the db object is, the above script does not pick that up, for example:
so for that case I found this script here that caters for that as well:
when I run the script above I get the following result, which includes the permission on the schema that reflects on my table.
SELECT
(
dp.state_desc + ' ' +
dp.permission_name collate latin1_general_cs_as +
' ON ' + '[' + s.name + ']' + '.' + '[' + o.name + ']' +
' TO ' + '[' + dpr.name + ']'
) AS GRANT_STMT
FROM sys.database_permissions AS dp
INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE 1=1
AND o.name IN ('YOUR TABLE NAME') -- Uncomment to filter to specific object(s)
-- AND dp.permission_name='EXECUTE' -- Uncomment to filter to just the EXECUTEs
ORDER BY dpr.namethe script above works for a database object.
however,
when I add permissions on the schema where the db object is, the above script does not pick that up, for example:
grant delete on schema::dbo to [db_webUser]
GOso for that case I found this script here that caters for that as well:
-----------------------------------------------------------------------
-- http://schottsql.blogspot.co.uk/2011/02/quickly-script-permissions-in-sql-2005.html
-----------------------------------------------------------------------
SELECT
state_desc + ' ' + permission_name +
' on ['+ ss.name + '].[' + so.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN sys.objects AS so
ON sdp.major_id = so.OBJECT_ID
JOIN SYS.SCHEMAS AS ss
ON so.SCHEMA_ID = ss.SCHEMA_ID
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
AND so.name = 'ItemStock'
UNION
SELECT
state_desc + ' ' + permission_name +
' on Schema::['+ ss.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN SYS.SCHEMAS AS ss
ON sdp.major_id = ss.SCHEMA_ID
AND sdp.class_desc = 'Schema'
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
order by [Permissions T-SQL]
GOwhen I run the script above I get the following result, which includes the permission on the schema that reflects on my table.
Code Snippets
SELECT
(
dp.state_desc + ' ' +
dp.permission_name collate latin1_general_cs_as +
' ON ' + '[' + s.name + ']' + '.' + '[' + o.name + ']' +
' TO ' + '[' + dpr.name + ']'
) AS GRANT_STMT
FROM sys.database_permissions AS dp
INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE 1=1
AND o.name IN ('YOUR TABLE NAME') -- Uncomment to filter to specific object(s)
-- AND dp.permission_name='EXECUTE' -- Uncomment to filter to just the EXECUTEs
ORDER BY dpr.namegrant delete on schema::dbo to [db_webUser]
GO-----------------------------------------------------------------------
-- http://schottsql.blogspot.co.uk/2011/02/quickly-script-permissions-in-sql-2005.html
-----------------------------------------------------------------------
SELECT
state_desc + ' ' + permission_name +
' on ['+ ss.name + '].[' + so.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN sys.objects AS so
ON sdp.major_id = so.OBJECT_ID
JOIN SYS.SCHEMAS AS ss
ON so.SCHEMA_ID = ss.SCHEMA_ID
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
AND so.name = 'ItemStock'
UNION
SELECT
state_desc + ' ' + permission_name +
' on Schema::['+ ss.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN SYS.SCHEMAS AS ss
ON sdp.major_id = ss.SCHEMA_ID
AND sdp.class_desc = 'Schema'
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
order by [Permissions T-SQL]
GOContext
StackExchange Database Administrators Q#114994, answer score: 9
Revisions (0)
No revisions yet.