SQL Server AUTO_FIX_Login_Users

数据库搬迁时,太多的Login和User需要匹配,过于麻烦,特意写了这个脚本,每次搬迁数据库只需跑下脚本匹配Login和User即可。

USE [msdb]
GO

/****** Object:  StoredProcedure [dbo].[usp_AUTO_FIX_Login_Users]    Script Date: 6/14/2013 2:06:32 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:  <SDS>
-- Create date: 2013/06/14
-- Description: 匹配Login和Users
-- =============================================
CREATE PROCEDURE [dbo].[usp_AUTO_FIX_Login_Users]
AS
BEGIN
 SET NOCOUNT ON;

 IF EXISTS (SELECT  * FROM  SYSOBJECTS WHERE ID = OBJECT_ID('dbo.databases') and XTYPE = 'U')
 DROP TABLE dbo.databases

 IF EXISTS (SELECT  * FROM  SYSOBJECTS WHERE ID = OBJECT_ID('dbo.login') and XTYPE = 'U')
 DROP TABLE dbo.login

 IF EXISTS (SELECT  * FROM  SYSOBJECTS WHERE ID = OBJECT_ID('dbo.users') and XTYPE = 'U')
 DROP TABLE dbo.users

 IF EXISTS (SELECT  * FROM  SYSOBJECTS WHERE ID = OBJECT_ID('dbo.Result') and XTYPE = 'U')
 DROP TABLE dbo.Result

 CREATE TABLE [dbo].[databases]([number] [int] NULL,[name] [nvarchar](50) NULL) ON [PRIMARY]
 CREATE TABLE [dbo].[login]([number] [int] NULL,[name] [nvarchar](50) NULL) ON [PRIMARY]
 CREATE TABLE [dbo].[users]([number] [int] NULL,[name] [nvarchar](50) NULL) ON [PRIMARY]
 CREATE TABLE [dbo].[Result]([Database][nvarchar](50) NULL,[Login] [nvarchar](50) NULL) ON [PRIMARY]

 DECLARE @l int
 DECLARE @d int
 DECLARE @lnumber int
 DECLARE @dnumber int
 declare @login as nvarchar(50)
 declare @databasename as nvarchar(50)
 declare @strsql1 as nvarchar(max)
 declare @strsql2 as nvarchar(max)
 declare @strsql3 as nvarchar(max)
 declare @strsql as nvarchar(max)
 declare @ROWCOUNT as int

 SET @l=1
 SET @d=1
 SET @strsql=''

 DELETE FROM dbo.databases
 INSERT INTO dbo.databases
 SELECT ROW_NUMBER() OVER (ORDER BY name ) AS number,name 
 FROM sys.databases
 WHERE state_desc='ONLINE' AND DatabasePropertyEx(name,'Updateability')<>'READ_ONLY'

 DELETE FROM dbo.login
 INSERT INTO dbo.login
 SELECT ROW_NUMBER() OVER (ORDER BY name ) AS number,name
 from sys.syslogins
 where len(name)<=10

 SELECT @dnumber=MAX(number) from dbo.databases
 SELECT @lnumber=MAX(number) from dbo.login

 WHILE(@d<=@dnumber)
 BEGIN
  SELECT @databasename=name FROM dbo.databases WHERE number=@d
  SET @strsql1 ='USE '+@databasename+' '
  WHILE (@l<=@lnumber)
  BEGIN
     SELECT @login= name FROM dbo.login WHERE number=@l
     EXEC('DELETE FROM dbo.users INSERT INTO dbo.users SELECT ''1'' as number,name FROM '+@databasename+'.DBO.sysusers where islogin=''1'' AND name='''+@login+''' ')
     SELECT @ROWCOUNT=COUNT(*) FROM dbo.users
     IF @ROWCOUNT>0
     BEGIN     
      INSERT INTO DBO.Result
      SELECT @databasename as [Database],@login as [Login]
      SET @strsql2= @strsql1+' EXEC sp_change_users_login ''AUTO_FIX'','''+@login+''' '
      SET @strsql = @strsql + @strsql2
      PRINT(@strsql)
      EXEC(@strsql)
     END
     SET @l=@l+1
  END
 SET @d=@d+1
 SET @l=1
 END

 SELECT * FROM dbo.Result
 DROP TABLE dbo.databases
 DROP TABLE dbo.login
 DROP TABLE dbo.users
 DROP TABLE dbo.Result


END

GO


 

原文地址:https://www.cnblogs.com/Fly446854715/p/4125809.html