问题描述
我有一个小问题,我没有找到解决方案。我正在对数据库实例名称,数据库名称和该数据库中的用户运行组合查询。
这是我的查询:
SELECT @@SERVERNAME AS 'Server Name'
use db1
SELECT DB_NAME() AS [Current Database];
select name as username,create_date,modify_date,type_desc
from sys.database_principals
where type not in ('A','G','R','X')
and sid is not null
and name != 'guest'
order by username;
SELECT @@SERVERNAME AS 'Server Name'
use db2
SELECT DB_NAME() AS [Current Database];
select name as username,'X')
and sid is not null
and name != 'guest'
order by username;
SELECT @@SERVERNAME AS 'Server Name'
use etc
SELECT DB_NAME() AS [Current Database];
select name as username,'X')
and sid is not null
and name != 'guest'
order by username;
输出的问题是即使正确也不能使用。 (我正在尝试将其手动复制粘贴到文本文件中。)
您能帮我吗?
解决方法
由于yu希望针对每个数据库执行此操作,因此我将使用一些(无耻的)自我升级,并使用我创建的名为sp_foreachdatabase
:A CURSOR free version of sp_msforeachdb的过程。有一个内置的程序可以执行类似的操作,但是它没有文档记录,有时行为不当。它还使用游标,SQL Server的许多经验丰富者都知道游标会尽量避免。
创建上面的内容后,我将稍作更改以将服务器和数据库放入列中,然后使用Pre和Post Command参数将CREATE
和SELECT
从临时目录表I INSERT
存入数据。
在创建对象之后,将给出以下语句:
USE master;
GO
DECLARE @Command nvarchar(MAX) = N'INSERT INTO #Users (servername,databasename,username,create_date,modify_date,type_desc)
SELECT @@SERVERNAME AS servername,& as databasename,[name] as username,type_desc
FROM sys.database_principals
WHERE type NOT IN (''A'',''G'',''R'',''X'')
AND sid IS NOT NULL
AND name != ''guest''
ORDER BY username;',@Pre_Command nvarchar(MAX) = N'CREATE TABLE #Users (servername sysname,databasename sysname,username sysname,create_date datetime,modify_date datetime,type_desc nvarchar(60));',@Post_Command nvarchar(MAX) = N'SELECT * FROM #Users;',@Command_Run nvarchar(MAX);
EXEC sp_foreachdatabase @Command = @Command,@Skip_System = 1,@Auto_Use = 1,@Pre_Command = @Pre_Command,@Post_Command = @Post_Command,@Command_Run = @Command_Run OUTPUT;
--PRINT @Command_Run;
--SELECT @Command_Run;