Sql-Server

sql server:獲取正在使用登錄名的所有數據庫

  • April 11, 2019

我正在創建一些遷移腳本來從頭開始生成 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

引用自:https://dba.stackexchange.com/questions/234503