1: SET ANSI_NULLS ON
2: GO
3:
4: SET QUOTED_IDENTIFIER ON
5: GO
6:
7:
8:
9: IF EXISTS ( SELECT 1
10: FROM dbo.sysobjects
11: WHERE id = OBJECT_ID(N'sp_fix_orphaned_users')
12: AND OBJECTPROPERTY(id, 'IsProcedure') = 1 )
13: DROP PROCEDURE sp_fix_orphaned_users;
14: GO
15:
16: --================================================================================
17: -- ProcedureName : sp_fix_orphaned_users
18: -- Author : Kerry
19: -- CreateDate : 2013-12-08
20: -- Description : 批量解决数据库孤立账号
21: -- http://www.cnblogs.com/kerrycode/
22: /**********************************************************************************************
23: Parameters : 参数说明
24: ***********************************************************************************************
25: @DefaultPwd : 所有孤立账户使用同一个密码@DefaultPwd
26: @LoginName : 所有需要fix的孤立账户,eg 'test1|test2|test3' 表示孤立账户test1、test2、test3。
27: @Password : 对应@LoginName,eg '@341|Dbd123|D#25' 分别表示上面账号对应的密码
28: *************************************************************************************************
29: Modified Date Modified User Version Modified Reason
30: ************************************************************************************************** 2013-12-08 Kerry V01.00.00 创建该存储过程。
31:
32: *************************************************************************************************/
33: --=================================================================================================
34:
35: CREATE PROCEDURE [dbo].[sp_fix_orphaned_users]
36: (
37: @IsUseSamePwd INT = 0 ,
38: @DefaultPwd VARCHAR(32) = NULL ,
39: @LoginName NVARCHAR(MAX) =NULL,
40: @Password NVARCHAR(MAX) =NULL
41: )
42: AS
43:
44: DECLARE @UserName NVARCHAR(64);
45: DECLARE @tmpPwd VARCHAR(20);
46: DECLARE @LoginRows INT;
47: DECLARE @PwdRows INT;
48:
49:
50:
51: IF @IsUseSamePwd =1 AND @DefaultPwd IS NULL
52: BEGIN
53: RAISERROR('%s Invalid. Please check the paramter %s value',16,1, '@DefaultPwd');
54: RETURN 1;
55: END
56:
57: IF @IsUseSamePwd = 0 AND ( @LoginName IS NULL OR @Password IS NULL)
58: BEGIN
59: RAISERROR('%s Invalid. Please check the paramter %s value',16,1, '@Password');
60: RETURN 1;
61: END
62:
63: IF @IsUseSamePwd = 0
64: BEGIN
65:
66: CREATE TABLE #TempLoginNams
67: (
68: ID INT,
69: UserName VARCHAR(20),
70: )
71:
72: INSERT INTO #TempLoginNams
73: ( ID, UserName )
74: SELECT * FROM dbo.SplitString(@LoginName,'|');
75:
76: CREATE TABLE #TempPassword
77: (
78: ID INT,
79: UserPassrd VARCHAR(20)
80: )
81:
82: INSERT INTO #TempPassword
83: SELECT * FROM dbo.SplitString(@Password,'|');
84:
85: SELECT @LoginRows=COUNT(1) FROM #TempLoginNams;
86: SELECT @PwdRows=COUNT(10) FROM #TempPassword;
87:
88: IF @LoginRows != @PwdRows
89: BEGIN
90: RAISERROR('The paramter %s have different nums. Please check the paramter %s value',16,1, '@LoginName & @Password ');
91: RETURN 1;
92: END
93:
94: END
95:
96:
97: CREATE TABLE #OrphanedUser
98: (
99: UserName sysname,
100: UserId INT
101: )
102:
103:
104: INSERT INTO #OrphanedUser EXEC sp_change_users_login @Action='Report';
105:
106:
107: DECLARE Cur_OrphanedUsers CURSOR FOR
108: SELECT UserName FROM #OrphanedUser;
109:
110:
111: OPEN Cur_OrphanedUsers;
112:
113: FETCH NEXT FROM Cur_OrphanedUsers INTO @UserName;
114: WHILE ( @@FETCH_STATUS = 0 )
115: BEGIN
116: IF @IsUseSamePwd = 1
117: BEGIN
118:
119: EXEC sp_change_users_login 'Auto_Fix', @UserName, NULL,
120: @DefaultPwd;
121:
122:
123: EXEC sp_change_users_login @Action = 'update_one',
124: @UserNamePattern = @UserName, @LoginName = @UserName;
125: END
126: ELSE
127: BEGIN
128: SELECT @UserName = o.UserName ,
129: @tmpPwd = p.UserPassrd
130: FROM #OrphanedUser o
131: LEFT JOIN #TempLoginNams l ON o.UserName = l.UserName
132: LEFT JOIN #TempPassword p ON l.ID = p.ID
133: WHERE o.UserName = @UserName;
134:
135: EXEC sp_change_users_login 'Auto_Fix', @UserName, NULL,
136: @tmpPwd;
137: EXEC sp_change_users_login @Action = 'update_one',
138: @UserNamePattern = @UserName, @LoginName = @UserName;
139: END
140:
141: FETCH NEXT FROM Cur_OrphanedUsers INTO @UserName
142: END
143: CLOSE Cur_OrphanedUsers
144: DEALLOCATE Cur_OrphanedUsers
145:
146: DROP TABLE #OrphanedUser;
147:
148: IF @IsUseSamePwd = 0
149: BEGIN
150: DROP TABLE #TempLoginNams;
151: DROP TABLE #TempPassword;
152: END
153:
154: GO