DECLARE
@sql VARCHAR(2048)
,@sort INT
DECLARE tmp CURSOR FOR
SELECT '-- [-- DB CONTEXT --] --' AS [
1 AS [
UNION
SELECT 'USE' + SPACE(1) + QUOTENAME(DB_NAME()) AS [
1 AS [
UNION
SELECT '' AS [
2 AS [
UNION
SELECT '-- [-- DB USERS --] --' AS [
3 AS [
UNION
SELECT 'IF NOT EXISTS (SELECT [name] FROM sys.database_principals WHERE [name] = ' + SPACE(1) + '''' + [name] + '''' + ') BEGIN CREATE USER ' + SPACE(1) + QUOTENAME([name]) + ' FOR LOGIN ' + QUOTENAME([name]) + ' WITH DEFAULT_SCHEMA = ' + QUOTENAME([default_schema_name]) + SPACE(1) + 'END; ' AS [
4 AS [
FROM sys.database_principals AS rm
WHERE [type] IN ('U', 'S', 'G')
UNION
SELECT '-- [-- DB ROLES --] --' AS [
5 AS [
UNION
SELECT 'EXEC sp_addrolemember @rolename ='
+ SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''') + ', @membername =' + SPACE(1) + QUOTENAME(USER_NAME(rm.member_principal_id), '''') AS [
6 AS [
FROM sys.database_role_members AS rm
WHERE USER_NAME(rm.member_principal_id) IN (
SELECT [name]
FROM sys.database_principals
WHERE [principal_id] > 4
and [type] IN ('G', 'S', 'U')
)
UNION
SELECT '' AS [
7 AS [
UNION
SELECT '-- [-- OBJECT LEVEL PERMISSIONS --] --' AS [
8 AS [
UNION
SELECT CASE
WHEN perm.state <> 'W' THEN perm.state_desc
ELSE 'GRANT'
END
+ SPACE(1) + perm.permission_name + SPACE(1) + 'ON ' + QUOTENAME(SCHEMA_NAME(obj.schema_id)) + '.' + QUOTENAME(obj.name)
+ CASE
WHEN cl.column_id IS NULL THEN SPACE(0)
ELSE '(' + QUOTENAME(cl.name) + ')'
END
+ SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USER_NAME(usr.principal_id)) COLLATE database_default
+ CASE
WHEN perm.state <> 'W' THEN SPACE(0)
ELSE SPACE(1) + 'WITH GRANT OPTION'
END
AS [
9 AS [
FROM
sys.database_permissions AS perm
INNER JOIN
sys.objects AS obj
ON perm.major_id = obj.[object_id]
INNER JOIN
sys.database_principals AS usr
ON perm.grantee_principal_id = usr.principal_id
LEFT JOIN
sys.columns AS cl
ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
UNION
SELECT '' AS [
10 AS [
UNION
SELECT '-- [--DB LEVEL PERMISSIONS --] --' AS [
11 AS [
UNION
SELECT CASE
WHEN perm.state <> 'W' THEN perm.state_desc
ELSE 'GRANT'
END
+ SPACE(1) + perm.permission_name
+ SPACE(1) + 'TO' + SPACE(1) + '[' + USER_NAME(usr.principal_id) + ']' COLLATE database_default
+ CASE
WHEN perm.state <> 'W' THEN SPACE(0)
ELSE SPACE(1) + 'WITH GRANT OPTION'
END
AS [
12 AS [
FROM sys.database_permissions AS perm
INNER JOIN
sys.database_principals AS usr
ON perm.grantee_principal_id = usr.principal_id
WHERE [perm].[major_id] = 0
AND [usr].[principal_id] > 4
AND [usr].[type] IN ('G', 'S', 'U')
UNION
SELECT '' AS [
13 AS [
UNION
SELECT '-- [--DB LEVEL SCHEMA PERMISSIONS --] --' AS [
14 AS [
UNION
SELECT CASE
WHEN perm.state <> 'W' THEN perm.state_desc
ELSE 'GRANT'
END
+ SPACE(1) + perm.permission_name
+ SPACE(1) + 'ON' + SPACE(1) + class_desc + '::' COLLATE database_default
+ QUOTENAME(SCHEMA_NAME(major_id))
+ SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USER_NAME(grantee_principal_id)) COLLATE database_default
+ CASE
WHEN perm.state <> 'W' THEN SPACE(0)
ELSE SPACE(1) + 'WITH GRANT OPTION'
END
AS [
15 AS [
from sys.database_permissions AS perm
inner join sys.schemas s
on perm.major_id = s.schema_id
inner join sys.database_principals dbprin
on perm.grantee_principal_id = dbprin.principal_id
WHERE class = 3
ORDER BY [
OPEN tmp
FETCH NEXT FROM tmp INTO @sql, @sort
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @sql
FETCH NEXT FROM tmp INTO @sql, @sort
END
CLOSE tmp
DEALLOCATE tmp
No comments:
Post a Comment