Sql-Server

字元串或二進制數據將在表 ‘’ 列 ‘’ 中被截斷。截斷值:’******’

  • September 8, 2020

我們的一個應用程序報告錯誤消息 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 門戶中設置的動態數據屏蔽規則的螢幕截圖

我還會檢查是否有其他數據庫屬於 Azure 中同一邏輯 SQL Server 實例的一部分——也許正在進行某種奇怪的跨數據庫查詢。

我認為它與 Azure SQL 數據庫(僅)中一個新的且被低估的錯誤有關,當發生錯誤 245 和 2628 時,臨時表的處理方式與普通表不同。

引用自:https://dba.stackexchange.com/questions/273325