-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathspDropUser_From_AllDatabases.sql
More file actions
107 lines (85 loc) · 3.6 KB
/
spDropUser_From_AllDatabases.sql
File metadata and controls
107 lines (85 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
USE [ADMIN]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
Description : Drop user from all databases
Usage : Drop login and exec sp
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'xxx')
DROP LOGIN [xxx];
exec spDropUser_From_AllDatabases @argUserName='xxx';
*/
CREATE OR ALTER PROCEDURE [dbo].[spDropUser_From_AllDatabases]
@argUserName VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @lcSQL NVARCHAR(MAX), @lcDatabaseName VARCHAR(128);
DECLARE @tblScripts TABLE(Script VARCHAR(MAX));
-- Check for Databases exclude readonly and secondaries
DECLARE curDatabases CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT D.name FROM sys.databases D WITH (NOLOCK)
LEFT JOIN sys.availability_databases_cluster AD WITH (NOLOCK) ON Ad.database_name=D.name
LEFT JOIN sys.dm_hadr_availability_replica_states RS WITH (NOLOCK) ON AD.group_id = RS.group_id
WHERE D.is_read_only=0 AND ISNULL(RS.is_local, 1) = 1 AND ISNULL(RS.[role],1)=1
ORDER BY name
OPEN curDatabases
FETCH NEXT FROM curDatabases INTO @lcDatabaseName
WHILE @@FETCH_STATUS=0
BEGIN
PRINT 'Checking Database : ' + @lcDatabaseName
DELETE FROM @tblScripts
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- Roles owned by user
SET @lcSQL = 'USE [' + @lcDatabaseName + '];
SELECT ''ALTER AUTHORIZATION ON ROLE::['' + R.name + ''] TO [dbo];''
FROM sys.database_principals R
JOIN sys.database_principals O ON R.owning_principal_id = O.principal_id
WHERE R.type=''R'' AND O.name = @argUserName;'
INSERT INTO @tblScripts
EXEC sp_executesql @lcSQL, N'@argUserName VARCHAR(50)', @argUserName;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- Schemas owned by user
SET @lcSQL = 'USE [' + @lcDatabaseName + '];
SELECT ''ALTER AUTHORIZATION ON SCHEMA::['' + S.name + ''] TO [dbo];''
FROM sys.schemas S
JOIN sys.database_principals O ON S.principal_id = O.principal_id
WHERE O.name = @argUserName;'
INSERT INTO @tblScripts
EXEC sp_executesql @lcSQL, N'@argUserName VARCHAR(50)', @argUserName;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- Drop Schema
SET @lcSQL = 'USE [' + @lcDatabaseName + '];
SELECT ''DROP SCHEMA ['' + name + '']; ''
FROM sys.schemas
WHERE name = @argUserName;'
INSERT INTO @tblScripts
EXEC sp_executesql @lcSQL, N'@argUserName VARCHAR(50)', @argUserName;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- Drop User
SET @lcSQL = 'USE [' + @lcDatabaseName + '];
SELECT ''DROP USER ['' + name + '']; ''
FROM sys.database_principals
WHERE name = @argUserName;'
INSERT INTO @tblScripts
EXEC sp_executesql @lcSQL, N'@argUserName VARCHAR(50)', @argUserName;
DECLARE @lcScript VARCHAR(1000)
DECLARE curScripts CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT 'USE [' + @lcDatabaseName + ']; ' + Script FROM @tblScripts
OPEN curScripts
FETCH NEXT FROM curScripts INTO @lcScript
WHILE @@FETCH_STATUS=0
BEGIN
PRINT CHAR(9) + 'Executing Script : ' + @lcScript
EXEC (@lcScript)
FETCH NEXT FROM curScripts INTO @lcScript
END
CLOSE curScripts
DEALLOCATE curScripts
FETCH NEXT FROM curDatabases INTO @lcDatabaseName
END
CLOSE curDatabases
DEALLOCATE curDatabases
END