Sql-Server
sql server:獲取正在使用登錄名的所有數據庫
我正在創建一些遷移腳本來從頭開始生成 sql server 數據庫。
在我的 ‘0005-create_login.up.sql’ 腳本中,我有類似的內容:
CREATE LOGIN [mylogin] WITH PASSWORD=N'xxx=', GO
在我的 ‘0005-create_login.down.sql’
DROP LOGIN [appws] GO
現在我只想在沒有在另一個數據庫中使用它的情況下刪除登錄。我查看了 sp_helplogins 程式碼:
sp_helptext 'sp_helplogins'
但這真的很複雜。我想知道是否有更簡單的方法可以登錄正在使用的數據庫。
查看我對類似問題的回答。如果它們目前映射到數據庫使用者,下面的程式碼將返回登錄列表和標誌。
CREATE TABLE ##UnusedLogins ( [Login] NVARCHAR(255), [InUse] BIT ) INSERT INTO ##UnusedLogins ([Login], [InUse]) SELECT [login].[name] AS [Login], 0 AS [InUse] FROM sys.server_principals [login] WHERE [login].[name] NOT LIKE 'NT SERVICE\%' AND [login].[name] NOT LIKE 'NT AUTHORITY\%' AND [login].[name] NOT LIKE '##%' AND [login].[type_desc] <> 'SERVER_ROLE' AND [login].[name] <> 'sa' EXEC sp_msforeachdb 'UPDATE ul SET [InUse] = 1 FROM ##UnusedLogins ul INNER JOIN sys.server_principals [login] ON [login].[name] = ul.[Login] INNER JOIN [?].sys.database_principals [user] ON [user].[sid] = [login].[sid]' SELECT * FROM ##UnusedLogins DROP TABLE ##UnusedLogins
略有不同的做法:
DECLARE @login sysname = N'mylogin'; SET NOCOUNT ON; DECLARE @t TABLE(db nvarchar(255)); DECLARE @sql nvarchar(max) = N'SELECT db = NULL', @base nvarchar(max) = N' UNION ALL SELECT PARSENAME(N''$qn$'',1) FROM $qn$.sys.database_principals AS dp WHERE EXISTS (SELECT 1 FROM sys.server_principals AS sp WHERE sp.SID = dp.SID AND name = @login)'; SELECT @sql += REPLACE(@base,N'$qn$',QUOTENAME(name)) FROM sys.databases WHERE state = 0; INSERT @t(db) EXEC sys.sp_executesql @sql, N'@login sysname', @login; DELETE @t WHERE db IS NULL; IF EXISTS (SELECT 1 FROM @t) BEGIN SELECT 'Not safe to drop. User is in these databases:'; SELECT db FROM @t; END ELSE BEGIN PRINT 'Safe to drop.'; END