字元串或二進制數據將在表 ‘’ 列 ‘’ 中被截斷。截斷值:’******’
我們的一個應用程序報告錯誤消息 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 執行查詢時使用更高權限的使用者
這是一個展示:
CREATE TABLE dbo.Test ( Id int IDENTITY PRIMARY KEY, Filler varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL ); GO CREATE USER TestUser WITHOUT LOGIN; GRANT SELECT ON dbo.Test TO TestUser; GRANT INSERT ON dbo.Test TO TestUser; GO EXECUTE AS USER = 'TestUser'; INSERT dbo.Test (Filler) VALUES (REPLICATE(N'A', 101)); REVERT;
結果是:
Msg 2628, Level 16, State 1, Line 12 String or binary data would be truncated in table '******', column '******'. Truncated value: '******'.
要在應用程序中獲取完整消息,您需要授予使用者
UNMASK
權限:GRANT UNMASK TO TestUser;
再次執行
INSERT
程式碼會產生完整的錯誤文本:Msg 2628, Level 16, State 1, Line 14 String or binary data would be truncated in table 'tempdb.dbo.Test', column 'Filler'. Truncated value: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
使用 Azure SQL 數據庫時,還可以在 Azure 門戶使用者界面中配置 Dynamic Data Masking。您可能想在那裡檢查(儘管據我所知,以這種方式設置的遮罩仍會更新
sys.columns
元數據):我還會檢查是否有其他數據庫屬於 Azure 中同一邏輯 SQL Server 實例的一部分——也許正在進行某種奇怪的跨數據庫查詢。
我認為它與 Azure SQL 數據庫(僅)中一個新的且被低估的錯誤有關,當發生錯誤 245 和 2628 時,臨時表的處理方式與普通表不同。