数据库搬迁时,太多的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