Scripting SQL Server permissions

前端 未结 9 1962
轮回少年
轮回少年 2021-01-30 02:58

I want to copy all the permission I\'ve set on stored procedures and other stuff from my development database to my production database. It\'s incredibly cumbersome, not to ment

9条回答
  •  北荒
    北荒 (楼主)
    2021-01-30 03:45

    Thanks to Chris for his awesome answer, I took it one step further and automated the process of running those statements (my table had over 8,000 permissions)

    if object_id('dbo.tempPermissions') is not null
    Drop table dbo.tempPermissions
    
    Create table tempPermissions(ID int identity , Queries Varchar(255))
    
    
    Insert into tempPermissions(Queries)
    
    
    select 'GRANT ' + dp.permission_name collate latin1_general_cs_as
       + ' ON ' + s.name + '.' + o.name + ' TO ' + dpr.name 
       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 dpr.name NOT IN ('public','guest')
    
    declare @count int, @max int, @query Varchar(255)
    set @count =1
    set @max = (Select max(ID) from tempPermissions)
    set @query = (Select Queries from tempPermissions where ID = @count)
    
    while(@count < @max)
    begin
    exec(@query)
    set @count += 1
    set @query = (Select Queries from tempPermissions where ID = @count)
    end
    
    select * from tempPermissions
    
    drop table tempPermissions
    

    additionally to restrict it to a single table add:

      and o.name = 'tablename'
    

    after the WHERE dpr.name NOT IN ('public','guest') and remember to edit the select statement so that it generates statements for the table you want to grant permissions 'TO' Not the table the permissions are coming 'FROM' (which is what the script does).

提交回复
热议问题