daf*_*eje 3 sql-server sql-server-2008-r2
能够通过错误日志查看谁成功登录到数据库以及哪个用户登录失败的详细信息是一件好事。但是,我有一个需要帮助的场景:
由于某种原因,成功和失败的详细信息被多次记录,因此,如果我在这一分钟登录到 SQL Server 2008 R2 实例,我会看到多个“用户登录成功...”消息。
任何人都可以帮助解决此问题(无需关闭保存登录成功/失败的选项),因为它正在填写日志并推送相关信息。

我意识到这并没有回答“为什么日志文件有多个‘登录成功...’条目”的问题,但是因为你似乎也担心其他日志条目被这些低-importance 登录消息,我想我会添加以下内容作为答案。
您可以使用以下代码,而不是使用 SQL Server Management Studio 的内置界面来查看日志文件,从而忽略您不感兴趣的日志消息。这使您可以专注于可能更直接相关的消息.
IF NOT EXISTS(
SELECT s.name + '.' + t.name
FROM tempdb.sys.tables t
INNER JOIN tempdb.sys.schemas s ON t.schema_id = s.schema_id
WHERE s.name + '.' + t.name = 'dbo.ErrorLogAnalysis'
)
BEGIN
CREATE TABLE tempdb.dbo.ErrorLogAnalysis
(
LogDate DATETIME,
ProcessInfo NVARCHAR(255),
[Text] NVARCHAR(MAX)
);
END
TRUNCATE TABLE tempdb.dbo.ErrorLogAnalysis;
EXEC sp_ReadErrorLog 0,1;
INSERT INTO tempdb.dbo.ErrorLogAnalysis
SELECT ela.*
FROM tempdb.dbo.ErrorLogAnalysis ela
WHERE ela.Text NOT LIKE 'Login succeeded%'
ORDER BY LogDate DESC;
Run Code Online (Sandbox Code Playgroud)
指出客户端代码很可能使用多个到 SQL Server 的连接可能会有所帮助。这实际上可能是 SQL Server 错误日志中记录了多个条目的确切原因。
为了证明这一点,我编写了一个非常简单的 VB.Net 命令行应用程序,它为我的本地 SQL Server 实例创建了 5 个连接。一旦打开了所有五个连接,应用程序就会对服务器执行一个简单的查询,显示session_id应用程序已打开的5 个值。然后关闭所有 5 个连接并退出。
这是代码:
Module Module1
Sub Main()
Dim sConnString As String =
"SERVER=localhost;" & _
"DATABASE=master;" & _
"TRUSTED_CONNECTION=True;" & _
"Application Name=MultiConnTest"
Dim sqlC1 As New SqlClient.SqlConnection(sConnString)
Dim sqlC2 As New SqlClient.SqlConnection(sConnString)
Dim sqlC3 As New SqlClient.SqlConnection(sConnString)
Dim sqlC4 As New SqlClient.SqlConnection(sConnString)
Dim sqlC5 As New SqlClient.SqlConnection(sConnString)
sqlC1.Open()
sqlC2.Open()
sqlC3.Open()
sqlC4.Open()
sqlC5.Open()
Dim sqlCMD As New SqlClient.SqlCommand( _
"SELECT session_id, login_name " & _
"FROM sys.dm_exec_sessions des " & _
"WHERE des.host_name = HOST_NAME " & _
" AND des.program_name = 'MultiConnTest';", sqlC1)
Console.WriteLine("Testing multiple connections to SQL Server.")
Console.WriteLine()
Console.WriteLine("Sessions currently open on the server, with username")
Dim sqlReader As SqlClient.SqlDataReader = sqlCMD.ExecuteReader
Dim iSessionID As Int32
Dim sUserName As String
While sqlReader.Read
iSessionID = sqlReader.GetValue(0)
sUserName = sqlReader.GetValue(1)
Console.WriteLine(iSessionID & vbTab & sUserName)
End While
sqlReader.Close()
sqlCMD = Nothing
sqlC1.Close()
sqlC2.Close()
sqlC3.Close()
sqlC4.Close()
sqlC5.Close()
Console.WriteLine("Press any key to exit")
Console.ReadKey()
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
在我的机器上运行它的控制台输出是:
Testing multiple connections to SQL Server.
Sessions currently open on the server, with username
52 Max
53 Max
54 Max
55 Max
56 Max
Press any key to exit
Run Code Online (Sandbox Code Playgroud)
SQL Server 错误日志在启用对成功和不成功登录的审核后显示:
LogDate ProcessInfo Text
2014-09-16 10:31:54.290 Logon Login succeeded for user 'Max'. Connection made using Windows authentication. [CLIENT: <local machine>]
2014-09-16 10:31:54.290 Logon Login succeeded for user 'Max'. Connection made using Windows authentication. [CLIENT: <local machine>]
2014-09-16 10:31:54.290 Logon Login succeeded for user 'Max'. Connection made using Windows authentication. [CLIENT: <local machine>]
2014-09-16 10:31:54.290 Logon Login succeeded for user 'Max'. Connection made using Windows authentication. [CLIENT: <local machine>]
2014-09-16 10:31:54.290 Logon Login succeeded for user 'Max'. Connection made using Windows authentication. [CLIENT: <local machine>]
Run Code Online (Sandbox Code Playgroud)
我认为您可以从中看出错误日志条目的可能来源不是可以“禁用”的某些错误的 SQL Server 行为,而是更有可能是审核成功登录和客户端的组合所产生的预期结果使用多个连接的应用程序。
我会检查针对您的 SQL Server 运行的任何应用程序的源代码,以确定它们是否实际上使用了多个连接。
如果是,我会sp_readerrorlog用来查看错误日志。我什至可能会创建一个存储过程来封装sp_readerrorlog以您想要的任何格式生成输出的功能。