我们的一个应用程序报告错误消息 2628:
string or binary data would be truncated in table '******', column '******'. Truncated value: '******'
代替
String or binary data would be truncated in table 'mytable', column 'mycolumn'. Truncated value: 'myvalue'.
我用 SSMS 得到的。
我需要更改什么设置才能获得完整的消息?
我试图搜索这个,但我得到的只是我需要将 VERBOSE_TRUNCATION_WARNINGS 设置为 ON,并将 compatibility_level 设置为 150。这是我多年前所做的。
该应用程序具有此错误处理程序:
try
{
ES.isWorking = true;
Worker worker = new Worker(new DBConnection(Settings.ConnectionString));
worker.DoWork();
ES.isWorking = false;
}
catch (Exception ex)
{
ES.isWorking = false;
this.eventLog.WriteEntry("In OnTimer exception ! message: " + ex.Message.ToString());
errorHandler.HandleException(ex, "In OnTimer exception !", ErrorSeverities.Error);
}
errorHandler 看起来像这样
Public Function HandleException(ByVal incommingEx As System.Exception,
ByVal note As String,
ByVal errorSeverity As ErrorSeverities,
Optional ByVal sessionId As String = "",
Optional ByVal applicationSource As String = "",
Optional ByVal ignoreDB As Boolean = False,
Optional ByVal noMail As Boolean = False) As Integer
Dim stackTraceBuilder As New System.Text.StringBuilder
Dim targetSite As String = ""
Dim errorTime As DateTime = Now
Dim messageBuilder As New System.Text.StringBuilder
Dim innerEx As Exception = incommingEx.InnerException
Dim errorId As Integer = 0
Dim innerCount As Integer = 1
Dim loggedToDb As Boolean = False
Dim appSource As String = Me._applicationSource
If applicationSource <> "" Then
appSource = applicationSource
End If
'... more code'
messageBuilder.AppendLine("(" + incommingEx.GetType.Name.ToUpper + ")" + vbCrLf + incommingEx.Message + " - SOURCE: " + incommingEx.Source)
'...'
While Not innerEx Is Nothing And innerCount <= 5
messageBuilder.AppendLine("INNER" + Convert.ToString(innerCount) + " (" + innerEx.GetType.Name.ToUpper + "):" + vbCrLf + **innerEx.Message** + " - SOURCE: " + innerEx.Source)
If Not innerEx Is Nothing AndAlso Not innerEx.StackTrace Is Nothing Then
stackTraceBuilder.AppendLine("INNER" + Convert.ToString(innerCount) + ": " + innerEx.StackTrace) 'Me.GetNumberedStack(innerEx))
End If
innerEx = innerEx.InnerException
innerCount += 1
End While
'... more code where the error message is inserted in a log table, via a sproc'
End Function
我们以前没有看到过这种行为,但我们最近将 .net 框架更新到了 4.7.2 版本,所以它可能是相关的。
错误文本“字符串或二进制”来自该位
- innerEx.Message + 那是一个简单的内置异常数据类型。因此,构建字符串的是 VB 和/或 .net 和/或 SQL Server,而不是我们。
该错误发生在调用存储过程之后,用户可能在其中输入了 varchar(1000) 文本。存储过程增加了一点,表没有空间容纳所有 1100 个字节。因此错误。存储过程没有 try-catch 块。
看起来这个表是用动态数据屏蔽定义的,并且应用程序用来访问数据库的用户没有查看屏蔽数据的权限(这很好!)。
这就是应用程序和 SSMS 之间的行为不同的原因:我希望您在从 SSMS 运行查询时使用更高权限的用户
这是一个演示:
结果是:
要在应用程序中获取完整消息,您需要授予用户
UNMASK
权限:再次运行
INSERT
代码会产生完整的错误文本:使用 Azure SQL 数据库时,还可以在 Azure 门户用户界面中配置 Dynamic Data Masking。您可能想在那里检查(尽管据我所知,以这种方式设置的掩码仍会更新
sys.columns
元数据):我还会检查是否有其他数据库属于 Azure 中同一逻辑 SQL Server 实例的一部分——也许正在进行某种奇怪的跨数据库查询。
我认为它与 Azure SQL 数据库(仅)中一个新的且被低估的错误有关,当发生错误 245 和 2628 时,临时表的处理方式与普通表不同。
我发现我已将敏感度分类添加到我的所有临时表中(并且仅添加到我的一些非临时表中)。
如在
当我放弃敏感度分类时,旧的错误消息又回来了。
我有一个演示错误的示例:
返回
这是正确的错误信息。现在运行这个:
当你运行这个
你会看到这个
这是不正确的错误消息。
我已经在 Azure SQL 数据库上尝试过这段代码,我得到了不正确的消息,在 SQL Server 2019 CU6 上,我只得到了正确的消息。
我已将此情况报告给 Microsoft,他们已承认这是一个错误,并将在几个月内修复。
我创建了两个脚本来 1) 记录现有分类,以及 2) 删除所有这些分类。
可以在此处找到脚本: 文档和放置分类
错误消息中的屏蔽也可能发生在与动态数据屏蔽(或临时表)无关的场景中。请参见以下示例:
在 SQL Server 2016 和 SQL Server 2017 中,这会产生以下错误消息:
令人惊讶的是,这种情况下的解决方案与其他情况下的解决方案相同:
GRANT UNMASK TO SimpleUser
我倾向于说这是一个错误,因为在 SQL Server 2019 CU5 中,我收到了完整的错误消息(未授予 UNMASK):
您看到的行为(即元数据在非/非帐户
***
的错误消息中被替换)似乎是跟踪标志 3625: Metadata Visibility Configuration的影响。我没有用于测试的 Azure 帐户,但文档确实表明此功能在 Azure SQL 数据库中可用。sysadmin
dbo
一个不太可能的可能性(事实上,此时甚至不应该)是有人为 配置了短暂的(谢天谢地!)“功能限制”选项
ERRORMESSAGE
,这实际上与跟踪标志 3625 相同。我相信有几个月的时间,当“功能限制”功能被逐步淘汰时,它可能之前已经配置但不再完全可访问。但是,最迟应在 2020 年 3 月 4 日之前 100% 删除该功能(从 Azure SQL 数据库中)。