0
点赞
收藏
分享

微信扫一扫

4046报错

小美人鱼失去的腿 2023-06-12 阅读 40

问题描述:

AG的主库上创建login user后,在备库上创建相同的login user,切换后使用user登录到备库,会有4046报错

原因:

因为两边master中的SID不一致,为保持创建的loin和之前的一致可以使用以下脚本进行

解决方案:

使用以下脚本进行login user permission的迁移

步骤如下:

1.先在主库上创建loin user

2.使用以下脚本输出login user的创建脚本

----create login

USE master  

GO  

IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  

   DROP PROCEDURE sp_hexadecimal  

GO  

CREATE PROCEDURE sp_hexadecimal  

       @binvalue varbinary(256),  

       @hexvalue varchar (514) OUTPUT  

AS  

DECLARE @charvalue varchar (514)  

DECLARE @i int  

DECLARE @length int  

DECLARE @hexstring char(16)  

SELECT @charvalue = '0x'  

SELECT @i = 1  

SELECT @length = DATALENGTH (@binvalue)  

SELECT @hexstring = '0123456789ABCDEF'  

WHILE (@i <= @length)  

BEGIN  

   DECLARE @tempint int  

   DECLARE @firstint int  

   DECLARE @secondint int  

   SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))  

   SELECT @firstint = FLOOR(@tempint/16)  

   SELECT @secondint = @tempint - (@firstint*16)  

   SELECT @charvalue = @charvalue +  

       SUBSTRING(@hexstring, @firstint+1, 1) +  

       SUBSTRING(@hexstring, @secondint+1, 1)  

   SELECT @i = @i + 1  

END  

SELECT @hexvalue = @charvalue  

GO     

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  

   DROP PROCEDURE sp_help_revlogin  

GO  

CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS  

DECLARE @name sysname  

DECLARE @type varchar (1)  

DECLARE @hasaccess int  

DECLARE @denylogin int  

DECLARE @is_disabled int  

DECLARE @PWD_varbinary    varbinary (256)  

DECLARE @PWD_string    varchar (514)  

DECLARE @SID_varbinary varbinary (85)  

DECLARE @SID_string varchar (514)  

DECLARE @tmpstr    varchar (1024)  

DECLARE @is_policy_checked varchar (3)  

DECLARE @is_expiration_checked varchar (3)  

DECLARE @defaultdb sysname     

IF (@login_name IS NULL)  

   DECLARE login_curs CURSOR FOR  

           SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM    

sys.server_principals p LEFT JOIN sys.syslogins l  

           ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'  

ELSE  

   DECLARE login_curs CURSOR FOR  

           SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM    

sys.server_principals p LEFT JOIN sys.syslogins l  

           ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name  

OPEN login_curs  

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin 

IF (@@fetch_status = -1)  

BEGIN  

   PRINT 'No login(s) found.'  

   CLOSE login_curs  

   DEALLOCATE login_curs  

   RETURN -1  

END  

SET @tmpstr = '/* sp_help_revlogin script '  

PRINT @tmpstr  

SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'  

PRINT @tmpstr  

PRINT ''  

WHILE (@@fetch_status <> -1)  

BEGIN  

   IF (@@fetch_status <> -2)  

   BEGIN  

       PRINT ''  

       SET @tmpstr = '-- Login: ' + @name  

       PRINT @tmpstr  

       IF (@type IN ( 'G', 'U'))  

       BEGIN -- NT authenticated account/group  

           SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'  

       END  

       ELSE BEGIN -- SQL Server authentication  

               -- obtain password and sid  

                       SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )  

               EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT  

               EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT  

               -- obtain password policy state  

               SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name  

               SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name  

                       SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'  

               IF ( @is_policy_checked IS NOT NULL )  

               BEGIN  

                   SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked  

               END  

               IF ( @is_expiration_checked IS NOT NULL )  

               BEGIN  

                   SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked  

               END  

       END  

       IF (@denylogin = 1)  

       BEGIN -- login is denied access  

           SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )  

       END  

       ELSE IF (@hasaccess = 0)  

       BEGIN -- login exists but does not have access  

           SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )  

       END  

       IF (@is_disabled = 1)  

       BEGIN -- login is disabled  

           SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'  

       END  

       PRINT @tmpstr  

   END  

   FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin  

    END  

CLOSE login_curs  

DEALLOCATE login_curs  

RETURN 0  

GO

exec sp_help_revlogin


--create user and permission

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE  PROCEDURE [dbo].[sp_permission_user]

@loginname [sysname] = null,

   @bcpFilename varchar(300)=null

WITH EXECUTE AS CALLER

AS

set nocount on

declare @dbname sysname

declare @cmd nvarchar(max)

--create table #temp(id int identity(1,1) not null,context varchar(max))

declare @tb_temp table(id int identity(1,1) not null,context nvarchar(max))

if @loginname is not null and  

not exists (select 1 from sys.syslogins  with(nolock)  where name=@loginname)

return  

insert into @tb_temp(context)

select 'use master'

union all

select 'go'

--declare dbcursor cursor for

create table #temp(id int identity(1,1),name varchar(50))

insert INTO #temp(name)

select name from sys.databases (nolock)

where state=0  

and name not in ('master','msdb','model','tempdb','distribution')

order by name

--open dbcursor

--fetch next from dbcursor into @dbname

declare @i int=1

declare @j int

select @j=MAX(id) from #temp

--WHILE @@FETCH_STATUS = 0

while(@i<=@j)

begin

select @dbname=name from #temp

where id=@i

insert into @tb_temp(context)

select '------'+@dbname

--数据库自定义角色

if @loginname is null

--if @dbname<>'msdb'

begin

select @cmd='select ''use ['+@dbname+'];

if not exists (select * from  sys.database_principals (nolock)  

where name=''''''+dp.name+'''''')

create role [''+dp.name+''] AUTHORIZATION [''+su.name+'']'' COLLATE LATIN1_General_CI_AS

From ['+@dbname+'].sys.database_principals dp (nolock)

join ['+@dbname+'].sys.database_principals su (nolock)  

on dp.owning_principal_id =su.principal_id

where dp.type_desc=''DATABASE_ROLE''

and dp.is_fixed_role=0  

and dp.name not in(''public'')

'

insert into @tb_temp(context)

exec (@cmd)

end

--数据库用户

if @loginname is not null

begin

select @cmd='select ''use ['+@dbname+'];

if exists (select * from  sys.schemas (nolock)  

where name=''''''+name+'''''')

drop schema [''+name+''];

if exists (select * from  sys.database_principals (nolock)  

where name=''''''+name+'''''')

drop user [''+name+'']; CREATE USER [''+name+''] FOR LOGIN [''+suser_sname(sid)+''] WITH DEFAULT_SCHEMA=[''+default_schema_name+'']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_principals (nolock)

where sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')  

and type in (''S'',''U'')

and suser_sname(sid) is not null'

insert into @tb_temp(context)

exec (@cmd)

select @cmd='select ''use ['+@dbname+'];

if exists (select * from  sys.schemas (nolock)  

where name=''''''+name+'''''')

drop schema [''+name+''];

if exists (select * from  sys.database_principals (nolock)  

where name=''''''+name+'''''')

drop user [''+name+'']; CREATE USER [''+name+''] FOR LOGIN [''+suser_sname(sid)+'']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_principals (nolock)

where sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')  

and type = ''G''  

and suser_sname(sid) is not null'

insert into @tb_temp(context)

exec (@cmd)

end

else

begin

select @cmd='select ''use ['+@dbname+'];

if exists (select * from  sys.schemas (nolock)  

where name=''''''+name+'''''')

drop schema [''+name+''];

if exists (select * from  sys.database_principals (nolock)  

where name=''''''+name+'''''')

drop user [''+name+'']; CREATE USER [''+name+''] FOR LOGIN [''+suser_sname(sid)+''] WITH DEFAULT_SCHEMA=[''+default_schema_name+'']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_principals (nolock)

where name not in(''dbo'',''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and type in (''S'',''U'')

and suser_sname(sid) is not null'

insert into @tb_temp(context)

exec (@cmd)

select @cmd='select ''use ['+@dbname+'];

if exists (select * from  sys.schemas (nolock)  

where name=''''''+name+'''''')

drop schema [''+name+''];

if exists (select * from  sys.database_principals (nolock)  

where name=''''''+name+'''''')

drop user [''+name+'']; CREATE USER [''+name+''] FOR LOGIN [''+suser_sname(sid)+'']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_principals (nolock)

where name<>''dbo'' and type = ''G''  and name not like ''%SQLServer2005%''

--and suser_sname(sid) is not null'

insert into @tb_temp(context)

exec (@cmd)

end

--用户角色对应关系

if @loginname is not null

select @cmd='select ''use ['+@dbname+']; exec sp_addrolemember ''''''+su.name+'''''',''''''+su1.name+''''''''

from ['+@dbname+'].sys.database_role_members  dr (nolock)

join ['+@dbname+'].sys.database_principals su (nolock) on su.principal_id=dr.role_principal_id

join ['+@dbname+'].sys.database_principals su1 (nolock) on su1.principal_id=dr.member_principal_id

--where su1.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')  

'

else

select @cmd='select ''use ['+@dbname+']; exec sp_addrolemember ''''''+su.name+'''''',''''''+su1.name+''''''''

from ['+@dbname+'].sys.database_role_members  dr (nolock)

join ['+@dbname+'].sys.database_principals su (nolock) on su.principal_id=dr.role_principal_id

join ['+@dbname+'].sys.database_principals su1 (nolock) on su1.principal_id=dr.member_principal_id

where su1.name not in(''dbo'',''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and su1.name not like ''%SQLServer2005%''

and suser_sname(su1.sid) is not null'

insert into @tb_temp(context)

exec (@cmd)

--数据库级别权限

if @loginname is not null

begin

--if @dbname<>'msdb'

--begin

select @cmd='select ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on [''+ s.name + ''].['' + o.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.all_objects o (nolock)

join ['+@dbname+'].sys.database_permissions dp (nolock) on dp.major_id = o.object_id

join ['+@dbname+'].sys.schemas s (nolock) on o.schema_id = s.schema_id

join ['+@dbname+'].sys.database_principals  du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''OBJECT_OR_COLUMN'' and dp.minor_id=0

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on [''+ s.name + ''].['' + o.name + ''](''+ac.name+'') to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.all_objects o (nolock)

join ['+@dbname+'].sys.database_permissions dp (nolock) on dp.major_id = o.object_id

join ['+@dbname+'].sys.all_columns ac (nolock) on ac.object_id=o.object_id AND dp.minor_id=ac.column_id  

join ['+@dbname+'].sys.schemas  s (nolock) on o.schema_id = s.schema_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''OBJECT_OR_COLUMN'' and dp.minor_id<>0

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

union all

select  ''use ['+@dbname+']; ''+  

state_desc+'' ''+permission_name+'' to ''+du.name COLLATE LATIN1_General_CI_AS

From ['+@dbname+'].sys.database_permissions dp (nolock)

join ['+@dbname+'].sys.database_principals  du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE'' and permission_name<>''CONNECT''

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

order by 1 desc'

insert into @tb_temp(context)

exec (@cmd)

select @cmd='select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on SCHEMA::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.schemas  s (nolock) on dp.major_id = s.schema_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''SCHEMA''  

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on ROLE::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.database_principals  s (nolock) on dp.major_id = s.principal_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE_PRINCIPAL'' and s.type =''R''

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on USER::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.database_principals  s (nolock) on dp.major_id = s.principal_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE_PRINCIPAL'' and s.type =''S''

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on TYPE::[''+ s.name + ''].['' + o.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.types  o (nolock) on dp.major_id = o.user_type_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

join ['+@dbname+'].sys.schemas s (nolock) on o.schema_id = s.schema_id

where class_desc=''TYPE''  

and du.type in (''S'',''U'',''G'')

and dp.grantee_principal_id>0

and du.sid in (select sid from sys.syslogins (nolock) where name='''+@loginname+''')

order by 1 desc'

insert into @tb_temp(context)

exec (@cmd)

--end

end

else

begin

--if @dbname<>'msdb'

--begin

select @cmd='select ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on [''+ s.name + ''].['' + o.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.all_objects o (nolock)

join ['+@dbname+'].sys.database_permissions dp (nolock) on dp.major_id = o.object_id

join ['+@dbname+'].sys.schemas s (nolock) on o.schema_id = s.schema_id

join ['+@dbname+'].sys.database_principals  du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''OBJECT_OR_COLUMN'' and dp.minor_id=0

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on [''+ s.name + ''].['' + o.name + ''](''+ac.name+'') to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.all_objects o (nolock)

join ['+@dbname+'].sys.database_permissions dp (nolock) on dp.major_id = o.object_id

join ['+@dbname+'].sys.all_columns ac (nolock) on ac.object_id=o.object_id AND dp.minor_id=ac.column_id  

join ['+@dbname+'].sys.schemas  s (nolock) on o.schema_id = s.schema_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''OBJECT_OR_COLUMN'' and dp.minor_id<>0

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

union all

select  ''use ['+@dbname+']; ''+  

state_desc+'' ''+permission_name+'' to ''+du.name COLLATE LATIN1_General_CI_AS

From ['+@dbname+'].sys.database_permissions dp (nolock)

join ['+@dbname+'].sys.database_principals  du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE'' and permission_name<>''CONNECT''

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

order by 1 desc'

insert into @tb_temp(context)

exec (@cmd)

select @cmd='select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on SCHEMA::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.schemas  s (nolock) on dp.major_id = s.schema_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''SCHEMA''  

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on ROLE::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.database_principals  s (nolock) on dp.major_id = s.principal_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE_PRINCIPAL'' and s.type =''R''

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on USER::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.database_principals  s (nolock) on dp.major_id = s.principal_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE_PRINCIPAL'' and s.type =''S''

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on TYPE::[''+ s.name + ''].['' + o.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.types  o (nolock) on dp.major_id = o.user_type_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

join ['+@dbname+'].sys.schemas s (nolock) on o.schema_id = s.schema_id

where class_desc=''TYPE''  

and du.type =''R''

and du.name not in(''public'')

and dp.grantee_principal_id>0

order by 1 desc'

insert into @tb_temp(context)

exec (@cmd)

select @cmd='select ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on [''+ s.name + ''].['' + o.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.all_objects o (nolock)

join ['+@dbname+'].sys.database_permissions dp (nolock) on dp.major_id = o.object_id

join ['+@dbname+'].sys.schemas s (nolock) on o.schema_id = s.schema_id

join ['+@dbname+'].sys.database_principals  du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''OBJECT_OR_COLUMN'' and dp.minor_id=0

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on [''+ s.name + ''].['' + o.name + ''](''+ac.name+'') to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.all_objects o (nolock)

join ['+@dbname+'].sys.database_permissions dp (nolock) on dp.major_id = o.object_id

join ['+@dbname+'].sys.all_columns ac (nolock) on ac.object_id=o.object_id AND dp.minor_id=ac.column_id  

join ['+@dbname+'].sys.schemas  s (nolock) on o.schema_id = s.schema_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''OBJECT_OR_COLUMN'' and dp.minor_id<>0

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

union all

select  ''use ['+@dbname+']; ''+  

state_desc+'' ''+permission_name+'' to ''+du.name COLLATE LATIN1_General_CI_AS

From ['+@dbname+'].sys.database_permissions dp (nolock)

join ['+@dbname+'].sys.database_principals  du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE'' and permission_name<>''CONNECT''

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

order by 1 desc'

insert into @tb_temp(context)

exec (@cmd)

select @cmd='select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on SCHEMA::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.schemas  s (nolock) on dp.major_id = s.schema_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''SCHEMA''  

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on ROLE::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.database_principals  s (nolock) on dp.major_id = s.principal_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE_PRINCIPAL'' and s.type =''R''

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on USER::[''+ s.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.database_principals  s (nolock) on dp.major_id = s.principal_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

where class_desc=''DATABASE_PRINCIPAL'' and s.type =''S''

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

union all

select  ''use ['+@dbname+']; ''+  

   state_desc + '' '' + permission_name + '' on TYPE::[''+ s.name + ''].['' + o.name + ''] to ['' + du.name + '']'' COLLATE LATIN1_General_CI_AS

from ['+@dbname+'].sys.database_permissions dp (nolock)  

join ['+@dbname+'].sys.types  o (nolock) on dp.major_id = o.user_type_id

join ['+@dbname+'].sys.database_principals du (nolock) on dp.grantee_principal_id = du.principal_id

join ['+@dbname+'].sys.schemas s (nolock) on o.schema_id = s.schema_id

where class_desc=''TYPE''  

and du.type in (''S'',''U'',''G'') and du.name not like ''%SQLServer2005%''

and du.name not in(''##MS_PolicyEventProcessingLogin##'',''##MS_PolicyTsqlExecutionLogin##'')  

and dp.grantee_principal_id>0

and suser_sname(du.sid) is not null

order by 1 desc'

insert into @tb_temp(context)

exec (@cmd)

--end

end

if @bcpfilename is null

  select context from @tb_temp order by id

else  --将结果导出到@bcpfilename文件中

begin

   if object_id('tempdb..##tb_result_SQLPermissions_user') is not null

  drop table ##tb_result_SQLPermissions_user

      create table ##tb_result_SQLPermissions_user(id int ,context varchar(max))

      insert into ##tb_result_SQLPermissions_user select id,context from @tb_temp order by id

   select @cmd='master..xp_cmdshell ''bcp "select context from ##tb_result_SQLPermissions_user order by id" queryout '+@bcpFilename+@dbname+'.txt -T -c -S'+@@servername+''''

   exec (@cmd)  

   drop table ##tb_result_SQLPermissions_user

end

delete from @tb_temp

--fetch next from dbcursor into @dbname

set @i=@i+1

end

--CLOSE dbcursor

--DEALLOCATE dbcursor

drop table #temp

GO

exec sp_permission_user

3.进行主备切换

4.将2中的输出脚本在新的主库上进行再次运行

5.进行测试,无4046报错

举报

相关推荐

0 条评论