AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

string ou dados binários seriam truncados na tabela '******', coluna '******'. Valor truncado: '*******'

  • 772

Um de nossos aplicativos relata a mensagem de erro 2628:

string or binary data would be truncated in table '******', column '******'. Truncated value: '******'

ao invés de

String or binary data would be truncated in table 'mytable', column 'mycolumn'. Truncated value: 'myvalue'.

que eu recebo com SSMS.

Que configuração preciso alterar para obter a mensagem completa?

Tentei procurar por isso, mas tudo o que consigo é que preciso definir VERBOSE_TRUNCATION_WARNINGS como ON e compatibility_level como 150. O que fiz há muito tempo.

O aplicativo tem este manipulador de erros:

 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);
     }

O errorHandler se parece com isso

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

Não vimos esse comportamento antes, mas atualizamos recentemente o framework .net para a versão 4.7.2, para que possa estar relacionado.

o texto de erro "string ou binário" está vindo do bit que vai

  • innerEx.Message + e esse é um tipo de dados Exception interno simples. Portanto, é VB e/ou .net e/ou SQL Server que está construindo a string, não nós.

O erro ocorre após uma chamada para um procedimento armazenado, onde o usuário provavelmente digitou um texto varchar(1000). O procedimento armazenado adiciona um pouco mais e a tabela não tem espaço para todos os 1100 bytes. Daí o erro. O procedimento armazenado não tem um bloco try-catch.

sql-server azure-sql-database
  • 5 5 respostas
  • 2343 Views

5 respostas

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

    Parece que esta tabela foi definida com mascaramento de dados dinâmico e o usuário que o aplicativo usa para acessar o banco de dados não tem permissão para visualizar dados mascarados (o que é bom!).

    É por isso que o comportamento difere entre o aplicativo e o SSMS: espero que você esteja usando um usuário com privilégios mais altos ao executar a consulta do SSMS

    Aqui está uma demonstração:

    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;
    

    O resultado disso é:

    Msg 2628, Level 16, State 1, Line 12
    String or binary data would be truncated in table '******', column '******'. Truncated value: '******'.
    

    Para obter a mensagem completa no aplicativo, você precisará conceder a UNMASKpermissão ao usuário:

    GRANT UNMASK TO TestUser;
    

    Executar o INSERTcódigo novamente resulta no texto completo do erro:

    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'.
    

    Ao usar o Banco de Dados SQL do Azure, o Mascaramento de Dados Dinâmico também pode ser configurado na interface do usuário do Portal do Azure. Você pode querer verificar lá (embora, até onde eu saiba, as máscaras configuradas dessa maneira ainda atualizam os sys.columnsmetadados):

    Captura de tela da regra de mascaramento de dados dinâmico configurada no Portal do Azure

    Eu também verificaria se há outros bancos de dados que fazem parte da mesma instância lógica do SQL Server no Azure - talvez haja algum tipo de consulta estranha entre bancos de dados em andamento.

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

    Acho que está relacionado a um bug novo e subnotificado no Banco de Dados SQL do Azure (somente), onde as Tabelas Temporais são tratadas de forma diferente das tabelas normais, quando ocorrem os erros 245 e 2628.

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

    Descobri que adicionei a Classificação de Sensibilidade a todas as minhas Tabelas Temporais (e apenas a algumas das minhas Tabelas não Temporais).

    Como em

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

    quando eu descarto a Classificação de Sensibilidade, a antiga mensagem de erro está de volta.

    Tenho um exemplo que demonstra o erro:

    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
    

    retorna

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

    Esta é a mensagem de erro correta . Agora execute isso:

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

    e quando você executa isso

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

    Você vai ver isso

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

    Esta é a mensagem de erro incorreta .

    Eu tentei este código no Banco de Dados SQL do Azure, onde recebo a mensagem incorreta, e no SQL Server 2019 CU6, onde recebo apenas a mensagem correta.

    Eu relatei isso à Microsoft, e eles reconheceram que isso é um bug e que será corrigido em alguns meses.

    Criei dois scripts para 1) documentar as classificações existentes e 2) eliminar todas essas classificações.

    Os scripts podem ser encontrados aqui: document and drop classificações

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

    O mascaramento na mensagem de erro pode ocorrer também em cenários não relacionados ao mascaramento dinâmico de dados (ou tabelas temporais). Veja o exemplo a seguir:

    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
    

    No SQL Server 2016 e no SQL Server 2017, isso produz a seguinte mensagem de erro:

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

    Surpreendentemente, a solução neste caso é a mesma que nos outros casos:GRANT UNMASK TO SimpleUser

    Estou inclinado a dizer que isso é um bug, porque no SQL Server 2019 CU5, recebo a mensagem de erro completa (sem conceder 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

    O comportamento que você está vendo (ou seja, meta-dados sendo substituídos por ***mensagens de erro para contas sysadminnão/não dbo-contas) parece ser o efeito do sinalizador de rastreamento 3625: Configuração de visibilidade de metadados . Não tenho uma conta do Azure para testar, mas a documentação indica que esse recurso está disponível no Banco de Dados SQL do Azure.

    Uma possibilidade muito menos provável (na verdade, nem deveria ser possível neste momento) é que alguém configurou a opção "restrições de recursos" de curta duração ( felizmente!ERRORMESSAGE ) para , que era efetivamente a mesma coisa que o sinalizador de rastreamento 3625. Houve alguns meses, acredito, em que o recurso "Restrições de recursos" estava sendo desativado em que era possível que ele fosse configurado anteriormente, mas não estivesse mais totalmente acessível. No entanto, esse recurso deve ter sido 100% removido (do Banco de Dados SQL do Azure) até 4 de março de 2020, o mais tardar.

    • 5

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve