AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 273325
Accepted
Henrik Staun Poulsen
Henrik Staun Poulsen
Asked: 2020-08-07 03:36:11 +0800 CST2020-08-07 03:36:11 +0800 CST 2020-08-07 03:36:11 +0800 CST

字符串或二进制数据将在表 '******' 列 '******' 中被截断。截断值:'******'

  • 772

我们的一个应用程序报告错误消息 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 块。

sql-server azure-sql-database
  • 5 5 个回答
  • 2343 Views

5 个回答

  • Voted
  1. Josh Darnell
    2020-08-07T05:18:23+08:002020-08-07T05:18:23+08:00

    看起来这个表是用动态数据屏蔽定义的,并且应用程序用来访问数据库的用户没有查看屏蔽数据的权限(这很好!)。

    这就是应用程序和 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 实例的一部分——也许正在进行某种奇怪的跨数据库查询。

    • 13
  2. Dennis klitgaard
    2020-08-13T04:38:04+08:002020-08-13T04:38:04+08:00

    我认为它与 Azure SQL 数据库(仅)中一个新的且被低估的错误有关,当发生错误 245 和 2628 时,临时表的处理方式与普通表不同。

    • 7
  3. Best Answer
    Henrik Staun Poulsen
    2020-08-19T04:37:40+08:002020-08-19T04:37:40+08:00

    我发现我已将敏感度分类添加到我的所有临时表中(并且仅添加到我的一些非临时表中)。

    如在

    add SENSITIVITY CLASSIFICATION to dbo.Mytable.name with (LABEL = 'General', INFORMATION_TYPE = 'Public')
    

    当我放弃敏感度分类时,旧的错误消息又回来了。

    我有一个演示错误的示例:

    drop table if exists dbo.mytable
    go
    create table dbo.Mytable (i int not null identity(1,1) primary key clustered, name varchar(10) not null)
    go
    insert into dbo.Mytable ( name ) values ( 'abc' )
    go
    select * from dbo.Mytable where name = 1  -- programming error; data type mis-match
    

    返回

    (1 row affected)
    Msg 245, Level 16, State 1, Line 8
    Conversion failed when converting the varchar value 'abc' to data type int.
    

    这是正确的错误信息。现在运行这个:

    add SENSITIVITY CLASSIFICATION to dbo.Mytable.name with (LABEL = 'General', INFORMATION_TYPE = 'Public')
    

    当你运行这个

    select * from dbo.Mytable where name = 1 -- programming error; data type mis-match
    

    你会看到这个

    Msg 245, Level 16, State 1, Line 169
    Conversion failed when converting the ****** value '******' to data type ******.
    

    这是不正确的错误消息。

    我已经在 Azure SQL 数据库上尝试过这段代码,我得到了不正确的消息,在 SQL Server 2019 CU6 上,我只得到了正确的消息。

    我已将此情况报告给 Microsoft,他们已承认这是一个错误,并将在几个月内修复。

    我创建了两个脚本来 1) 记录现有分类,以及 2) 删除所有这些分类。

    可以在此处找到脚本: 文档和放置分类

    • 7
  4. Razvan Socol
    2020-08-16T20:53:19+08:002020-08-16T20:53:19+08:00

    错误消息中的屏蔽也可能发生在与动态数据屏蔽(或临时表)无关的场景中。请参见以下示例:

    CREATE DATABASE ErrorMessageTest
    GO
    USE ErrorMessageTest
    GO
    CREATE USER SimpleUser WITHOUT LOGIN
    GO
    ALTER ROLE db_datareader ADD MEMBER SimpleUser
    GO
    CREATE FUNCTION dbo.Numbers(@MaxNumber int)
    RETURNS TABLE AS RETURN
     WITH Nbrs_4( n ) AS ( SELECT 1 UNION SELECT 0 ),
              Nbrs_3( n ) AS ( SELECT 1 FROM Nbrs_4 n1 CROSS JOIN Nbrs_4 n2 ),
              Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),
              Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),
              Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),
              Nbrs  ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )
            SELECT n
              FROM ( SELECT ROW_NUMBER() OVER (ORDER BY n)
                       FROM Nbrs ) D ( n )
             WHERE n <= @MaxNumber ;
    GO
    CREATE FUNCTION dbo.Split(@Param nvarchar(MAX),@Separator NCHAR(1))
    RETURNS TABLE AS RETURN 
    SELECT SUBSTRING(@Param, N, CHARINDEX(@Separator, @Param + @Separator, n) - n) AS VALUE, 
        ROW_NUMBER() OVER (ORDER BY N) AS Position
    FROM dbo.Numbers(LEN(@Param)) n
    WHERE SUBSTRING(@Separator + @Param, n, 1) = @Separator
    
    GO
    EXECUTE AS USER='SimpleUser'
    
    DECLARE @ApplyToMonth NVARCHAR(101) = '1,2,3,4,5,6, test error message,8'
    
    SELECT t.VALUE AS OriginalValue, TRY_CAST(REPLACE(t.VALUE, ' ', '') AS INT) AS IntValue
        FROM dbo.Split(@ApplyToMonth, ',') t
    SELECT    x.OriginalValue, x.IntValue,
            CASE WHEN x.IntValue IS NULL THEN CAST(x.OriginalValue AS INT) ELSE 0 END AS RaisErrorColumn
    FROM (
        SELECT t.VALUE AS OriginalValue, TRY_CAST(REPLACE(t.VALUE, ' ', '') AS INT) AS IntValue
        FROM dbo.Split(@ApplyToMonth, ',') t
    ) x
    
    GO
    REVERT
    GO
    USE master
    GO
    DROP DATABASE ErrorMessageTest
    

    在 SQL Server 2016 和 SQL Server 2017 中,这会产生以下错误消息:

    Conversion failed when converting the ****** value '******' to data type ******.
    

    令人惊讶的是,这种情况下的解决方案与其他情况下的解决方案相同:GRANT UNMASK TO SimpleUser

    我倾向于说这是一个错误,因为在 SQL Server 2019 CU5 中,我收到了完整的错误消息(未授予 UNMASK):

    Conversion failed when converting the nvarchar value ' test error message' to data type int.
    
    • 6
  5. Solomon Rutzky
    2020-08-08T21:16:26+08:002020-08-08T21:16:26+08:00

    您看到的行为(即元数据在非/非帐户***的错误消息中被替换)似乎是跟踪标志 3625: Metadata Visibility Configuration的影响。我没有用于测试的 Azure 帐户,但文档确实表明此功能在 Azure SQL 数据库中可用。sysadmindbo

    一个不太可能的可能性(事实上,此时甚至不应该)是有人为 配置了短暂的(谢天谢地!)“功能限制”选项ERRORMESSAGE,这实际上与跟踪标志 3625 相同。我相信有几个月的时间,当“功能限制”功能被逐步淘汰时,它可能之前已经配置但不再完全可访问。但是,最迟应在 2020 年 3 月 4 日之前 100% 删除该功能(从 Azure SQL 数据库中)。

    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve