【问题标题】:How can I intrepret this SQL Server ERROR log我如何解释这个 SQL Server 错误日志
【发布时间】:2016-12-08 07:17:34
【问题描述】:

我花了几十个小时试图弄清楚为什么我无法通过我正在编写的 Windows 服务连接到我的数据库,并且在 LocalSystem 下运行。的错误快照是

2016-12-07 23:00:39.98 Logon       Login succeeded for user 'thelion'. Connection made using SQL Server authentication. [CLIENT: <local machine>]
2016-12-07 23:00:39.99 Logon       Error: 18456, Severity: 14, State: 38.
2016-12-07 23:00:39.99 Logon       Login failed for user 'thelion'. Reason: Failed to open the explicitly specified database 'LrcPageTask'. [CLIENT: <local machine>]
2016-12-07 23:04:10.72 Logon       Login succeeded for user 'thelion'. Connection made using SQL Server authentication. [CLIENT: <local machine>]
2016-12-07 23:04:10.73 Logon       Error: 18456, Severity: 14, State: 38.
2016-12-07 23:04:10.73 Logon       Login failed for user 'thelion'. Reason: Failed to open the explicitly specified database 'LrcPageTask'. [CLIENT: <local machine>]
2016-12-07 23:04:20.75 Logon       Login succeeded for user 'thelion'. Connection made using SQL Server authentication. [CLIENT: <local machine>]
2016-12-07 23:04:20.75 Logon       Error: 18456, Severity: 14, State: 38.
2016-12-07 23:04:20.75 Logon       Login failed for user 'thelion'. Reason: Failed to open the explicitly specified database 'LrcPageTask'. [CLIENT: <local machine>]

在调用我的OnStart 方法之后

    protected override void OnStart(string[] args)
    {
        EventLog.WriteEntry(ServiceName + " started");
        //PageLoadTimer.Enabled = true;
        try
        {
            repo.Add(new PageDocument()
            {
                Html = "<p>Test</p>",
                PageType = 0,
                DateAdded = DateTime.Now,
                DateProcessed = null
            });
        }
        catch(Exception e)
        {
            EventLog.WriteEntry(string.Format("Problem added a page document: {0}", e.Message));
        }
    }

调用Add方法

public class PageDocumentRepository : PageCRUD
{
    public void Add(PageDocument pd)
    {
        using(var context = GetPageTaskContext())
        {
            context.PageDocuments.Add(pd);
            context.SaveChanges();
        }
    }
}

GetPageTaskContext 就像

public abstract class PageCRUD
{
    public LrcPageTaskEntities GetPageTaskContext()
    { 
        return new LrcPageTaskEntities();
    }
}

LrcPageTaskEntities 在哪里

public partial class LrcPageTaskEntities : DbContext
{
    public LrcPageTaskEntities()
        : base("name=LrcPageTaskEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<PageDocument> PageDocuments { get; set; }
}

我的连接字符串是这样的

  <connectionStrings>
    <!--<add name="LrcPageTaskEntities" connectionString="metadata=res://*/Models.LrcPageTask.csdl|res://*/Models.LrcPageTask.ssdl|res://*/Models.LrcPageTask.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-300NQR3\SQLEXPRESS;initial catalog=LrcPageTask;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />-->
    <add name="LrcPageTaskEntities" connectionString="metadata=res://*/Models.LrcPageTask.csdl|res://*/Models.LrcPageTask.ssdl|res://*/Models.LrcPageTask.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-300NQR3\SQLEXPRESS;initial catalog=LrcPageTask;integrated security=false;user id=thelion;password=trump4america;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

我不知道这是否相关,但我正在使用 Visual Studio 2013 Express for Web 和 SQL Server Express 2016。

对解开谜团有帮助吗?

编辑:为了获得更多可见性,这是​​我尝试使用的登录名:

如果我尝试在LocalSystem 下使用Intregated Security=True 登录并且没有指定User Id / Password(因此我注释掉该连接字符串的原因),它不起作用。如果我尝试这样做,我会收到一连串登录错误

2016-12-07 23:17:27.95 Logon       Login succeeded for user 'NT SERVICE\SQLTELEMETRY$SQLEXPRESS'. Connection made using Windows authentication. [CLIENT: <local machine>]
2016-12-07 23:20:37.15 Logon       Login succeeded for user 'WORKGROUP\DESKTOP-300NQR3$'. Connection made using Windows authentication. [CLIENT: <local machine>]
2016-12-07 23:20:37.16 Logon       Error: 18456, Severity: 14, State: 38.
2016-12-07 23:20:37.16 Logon       Login failed for user 'WORKGROUP\DESKTOP-300NQR3$'. Reason: Failed to open the explicitly specified database 'LrcPageTask'. [CLIENT: <local machine>]
2016-12-07 23:20:47.20 Logon       Login succeeded for user 'WORKGROUP\DESKTOP-300NQR3$'. Connection made using Windows authentication. [CLIENT: <local machine>]
2016-12-07 23:20:47.20 Logon       Error: 18456, Severity: 14, State: 38.
2016-12-07 23:20:47.20 Logon       Login failed for user 'WORKGROUP\DESKTOP-300NQR3$'. Reason: Failed to open the explicitly specified database 'LrcPageTask'. [CLIENT: <local machine>]

【问题讨论】:

    标签: c# asp.net .net sql-server service


    【解决方案1】:

    状态 38 表示 'Login valid but database unavailable (or login not permissioned)'

    如果您想了解有关错误日志中每个州的更多信息,请阅读 Aaron Bertrand 的此博客 Troubleshooting Error 18456

    确保数据库存在并且登录用户拥有对数据库具有适当权限的用户。

    【讨论】:

      【解决方案2】:

      以下故障排除步骤来自:Troubleshoot Connectivity/Login failures (18456 State x) with SQL Server

      链接中与您相关的一些故障排除步骤:

      1.默认跟踪:
      您可以使用以下查询来查询默认跟踪

      DECLARE @trcpath nvarchar(256)
      
      SELECT  @trcpath=
      CAST(value as nvarchar(256)) 
      FROM  fn_trace_getinfo(default)  WHERE  property = 2
      
      ---Change “default” to 1 if you want to read
       information only from current trace file
        SELECT  * FROM fn_trace_gettable (@trcpath,default )
       WHERE  EventClass= 20
       ORDER BY starttime DESC 
      

      输出将如下所示..

      用户“del”登录失败。原因:无法打开登录属性中指定的数据库。 [客户: ] 用户“sa”登录失败。原因:密码与提供的登录名不匹配。 [客户:]

      2.环形缓冲区和扩展事件:
      您还可以使用 ringbuffer DMV 和 Err.exe 进行故障排除并获取故障原因..

      在 DMV 下运行,给你一些错误代码..

      SELECT dateadd (ms, (a.[Record Time] - sys.ms_ticks), GETDATE()) as [Notification_Time], a.* FROM 
      (SELECT 
      x.value('(//Record/@id)[1]', 'bigint') AS [Record_ID], 
      x.value('(//Record/Error/ErrorCode)[1]', 'varchar(30)') AS [ErrorCode], 
      x.value('(//Record/Error/APIName)[1]', 'varchar(255)') AS [APIName], 
      x.value('(//Record/Error/CallingAPIName)[1]', 'varchar(255)') AS [CallingAPIName], 
      x.value('(//Record/Error/SPID)[1]', 'int') AS [SPID], 
      x.value('(//Record/@time)[1]', 'bigint') AS [Record Time] 
      FROM (SELECT CAST (record as xml) FROM sys.dm_os_ring_buffers 
      WHERE ring_buffer_type = 'RING_BUFFER_SECURITY_ERROR') AS R(x)) a 
      CROSS JOIN sys.dm_os_sys_info sys 
      ORDER BY a.[Record_ID] DESC
      

      如果它给出例如 0x8C2 ,您可以使用 Err.exe 获取如下错误消息..

      Err.exe 0x8C2
      

      给予

      # for hex 0x8c2 / decimal 2242 :
        NERR_PasswordExpired                                          lmerr.h
      

      然后您可以在命令提示符下使用 NETHELP MSG 并获取更多详细信息,例如..

      NET HELPMSG 2242
      

      给予

      此用户的密码已过期

      解释

      您的密码已过期。在更改密码之前,您将无法执行任何网络任务。

      动作

      要更改密码,请按 Ctrl+Alt+Del,然后选择更改密码。

      参考资料:
      https://blogs.msdn.microsoft.com/sqlsakthi/2011/02/06/troubleshoot-connectivitylogin-failures-18456-state-x-with-sql-server/

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 2010-10-10
        • 2021-11-04
        相关资源
        最近更新 更多