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 / 334775
Accepted
mclayton
mclayton
Asked: 2024-01-12 06:15:50 +0800 CST2024-01-12 06:15:50 +0800 CST 2024-01-12 06:15:50 +0800 CST

Erro SQL72014 ao importar bacpac com múltiplas colunas usando um UDT vinculado a uma regra

  • 772

Desculpa

Em primeiro lugar, peço desculpas pela extensão - este é um problema estranho, então estou tentando fornecer detalhes suficientes para torná-lo reproduzível.


dr.

Acho que encontrei um problema ao exportar um *.bacpacaplicativo de camada de dados entre dois servidores MS SQL para migrar uma instância de um banco de dados Indeo ProGet que cria um bacpac inconsistente. Tentar importar este bacpac resulta em um erro, e eu apreciaria uma segunda olhada no problema para ter certeza de que não estou fazendo nada estúpido...

Acho que a causa raiz é um possível bug no processo "Exportar aplicativo da camada de dados" quando há várias colunas de esquema usando o mesmo tipo definido pelo usuário e o UDT está vinculado a uma regra de validação - o resultado parece ser um *.bacpacarquivo corrompido que não pode ser importado sem primeiro fazer alguns ajustes manuais.

Minha pergunta é:

  • Parte 1 : Estou fazendo algo errado ou isso é um bug conhecido (ou novo)?
  • Parte 2 : Se for um bug, você tem alguma ideia de onde posso reportá-lo?

Esquema

A seguir, recriamos uma pequena parte do esquema do banco de dados Inedo ProGet que demonstra o problema. (FWIW, atualmente estou usando o SQL Server 2022 v16.0.1105.1, mas tenho quase certeza de que isso também ocorre em outras versões).

Basicamente faz isso:

  • Cria um tipo definido pelo usuárioYNINDICATOR
  • Vincula-o a uma regra que restringe os valores YeN
  • Cria duas tabelas, cada uma com uma coluna do tipo YNINDICATOR(veja [dbo].[CustomLanguage].[Active_Indicator]e [dbo].[ClusterNodes].[Primary_Indicator])
CREATE TYPE [dbo].[YNINDICATOR] FROM [char](1) NULL
GO

CREATE RULE [dbo].[YNINDICATOR_Domain] 
AS
@Ind COLLATE Latin1_General_BIN IN ('Y', 'N');

EXEC sp_bindrule 'YNINDICATOR_Domain', 'YNINDICATOR'
GO

CREATE TABLE [dbo].[CustomLanguages](
    [CustomLanguage_Id] [int] IDENTITY(1,1) NOT NULL,
    [Culture_Name] [varchar](50) NOT NULL,
    [Language_Name] [nvarchar](100) NOT NULL,
    [Active_Indicator] [dbo].[YNINDICATOR] NOT NULL,
    [CustomLanguage_Xml] [xml] NOT NULL,
 CONSTRAINT [PK__CustomLanguages] PRIMARY KEY CLUSTERED 
(
    [CustomLanguage_Id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[ClusterNodes](
    [Server_Name] [nvarchar](64) NOT NULL,
    [NodeType_Code] [char](1) NOT NULL,
    [LastUpdated_Date] [datetime] NOT NULL,
    [Primary_Indicator] [dbo].[YNINDICATOR] NOT NULL,
    [Node_Configuration] [xml] NOT NULL,
 CONSTRAINT [PK__ClusterNodes] PRIMARY KEY CLUSTERED 
(
    [Server_Name] ASC,
    [NodeType_Code] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[ClusterNodes]  WITH CHECK ADD  CONSTRAINT [CK__ClusterNodes__NodeType_Code] CHECK  (([NodeType_Code]='S' OR [NodeType_Code]='W'))
GO
ALTER TABLE [dbo].[ClusterNodes] CHECK CONSTRAINT [CK__ClusterNodes__NodeType_Code]
GO

Erro

A exportação do esquema acima para um arquivo bacpac do aplicativo da camada de dados é concluída sem erros, mas a tentativa de reimportá-lo como um novo banco de dados gera o seguinte erro:

insira a descrição da imagem aqui

Estúdio de gerenciamento do Microsoft SQL Server

Não foi possível importar o pacote.

Erro SQL72014: Framework Microsoft SqlDataClient Data Provider: MSG 2714, Nível 16, Estado 3, Procedimento YNINDICATOR_Domain, Linha 1 Já existe um objeto chamado 'YNINDICATOR_Domain' no banco de dados.

Erro SQL72045: Erro de execução de script. O script executado:

CRIAR REGRA [dbo].[YINDICATOR_Domain]

AS @Ind COLLATE Latin1_General_BIN IN ('Y', 'N')

(Microsoft.SqlServer.Dac)


Investigação

Descompactei o bacpac e descobri que quando há mais de uma coluna definida usando o YNINDICATORUDT, o model.xmlarquivo dentro do bacpac contém algo assim, com dois SqlRule elementos definidos para [dbo].[YNINDICATOR_Domain]- o primeiro contém as referências da coluna e o segundo contém o UDT referência:

Bacpac quebrado – duas referências de coluna e uma referência UDT -> dois elementos SqlRule

... snip ...
<Element Type="SqlRule" Name="[dbo].[YNINDICATOR_Domain]">
    <Property Name="ExpressionScript">
        <Value><![CDATA[@Ind COLLATE Latin1_General_BIN IN ('Y', 'N')]]></Value>
    </Property>
    <Relationship Name="BoundTargets">
        <Entry>
            <References Name="[dbo].[CustomLanguages].[Active_Indicator]" />
        </Entry>
        <Entry>
            <References Name="[dbo].[ClusterNodes].[Primary_Indicator]" />
        </Entry>
    </Relationship>
    <Relationship Name="Schema">
        <Entry>
            <References ExternalSource="BuiltIns" Name="[dbo]" />
        </Entry>
    </Relationship>
</Element>
<Element Type="SqlRule" Name="[dbo].[YNINDICATOR_Domain]">
    <Property Name="ExpressionScript">
        <Value><![CDATA[@Ind COLLATE Latin1_General_BIN IN ('Y', 'N')]]></Value>
    </Property>
    <Relationship Name="BoundTargets">
        <Entry>
            <References Name="[dbo].[YNINDICATOR]" />
        </Entry>
    </Relationship>
    <Relationship Name="Schema">
        <Entry>
            <References ExternalSource="BuiltIns" Name="[dbo]" />
        </Entry>
    </Relationship>
</Element>
... snip ...

Esta é provavelmente a causa do already an object named 'YINDICATOR_Domain'erro porque ele tenta criar o SqlRule duas vezes – uma vez para cada um Element.

Se eu descartar qualquer uma das colunas usando o YNINDICATORUDT e reexportar um aplicativo da camada de dados, o bacpac conterá um único Element Type="SqlRule"nó que contém a coluna e as referências do UDT:

Trabalhando bacpac - uma referência de coluna e uma referência UDT -> um elemento SqlRule

... snip ...
<Element Type="SqlRule" Name="[dbo].[YNINDICATOR_Domain]">
    <Property Name="ExpressionScript">
        <Value><![CDATA[@Ind COLLATE Latin1_General_BIN IN ('Y', 'N')]]></Value>
    </Property>
    <Relationship Name="BoundTargets">
        <Entry>
            <References Name="[dbo].[CustomLanguages].[Active_Indicator]" />
        </Entry>
        <Entry>
            <References Name="[dbo].[YNINDICATOR]" />
        </Entry>
    </Relationship>
    <Relationship Name="Schema">
        <Entry>
            <References ExternalSource="BuiltIns" Name="[dbo]" />
        </Entry>
    </Relationship>
</Element>
... snip ...

e se eu usar sp_unbindrulepara remover a ligação, o bacpac contém apenas uma Element- ele não cria mais uma segunda para a ligação UDT, pois obviamente não existe mais:

Trabalhando bacpac - duas referências de coluna e nenhuma referência UDT -> um elemento SqlRule

<Element Type="SqlRule" Name="[dbo].[YNINDICATOR_Domain]">
    <Property Name="ExpressionScript">
        <Value><![CDATA[@Ind COLLATE Latin1_General_BIN IN ('Y', 'N')]]></Value>
    </Property>
    <Relationship Name="BoundTargets">
        <Entry>
            <References Name="[dbo].[CustomLanguages].[Active_Indicator]" />
        </Entry>
        <Entry>
            <References Name="[dbo].[ClusterNodes].[Primary_Indicator]" />
        </Entry>
    </Relationship>
    <Relationship Name="Schema">
        <Entry>
            <References ExternalSource="BuiltIns" Name="[dbo]" />
        </Entry>
    </Relationship>
</Element>

Na verdade, não posso usar nenhuma dessas opções, pois ela não corresponde ao esquema de banco de dados real do aplicativo ProGet, mas é interessante observar como a coluna e a ligação UDT são serializadas dependendo se há uma ou mais de uma coluna usando o UDT.


Gambiarra

Se eu hackear manualmentemodel.xml o arquivo bacpac original e mesclar os dois SqlRule Elements para que haja apenas um que contenha as colunas e a vinculação de regras, posso importá-lo corretamente e ele criará todos os objetos de esquema sem erros:

Isso não é muito útil, pois não quero continuar fazendo isso toda vez que migrar o banco de dados (não farei isso muitas vezes, mas o suficiente para que seja uma solução alternativa dolorosa).

Bacpac funcionando - duas referências de coluna e uma referência UDT hackeadas em um elemento SqlRule

<Element Type="SqlRule" Name="[dbo].[YNINDICATOR_Domain]">
    <Property Name="ExpressionScript">
        <Value><![CDATA[@Ind COLLATE Latin1_General_BIN IN ('Y', 'N')]]></Value>
    </Property>
    <Relationship Name="BoundTargets">
        <Entry>
            <References Name="[dbo].[CustomLanguages].[Active_Indicator]" />
        </Entry>
        <Entry>
            <References Name="[dbo].[ClusterNodes].[Primary_Indicator]" />
        </Entry>
        <Entry>
            <References Name="[dbo].[YNINDICATOR]" />
        </Entry>
    </Relationship>
    <Relationship Name="Schema">
        <Entry>
            <References ExternalSource="BuiltIns" Name="[dbo]" />
        </Entry>
    </Relationship>
</Element>

Observação lateral: se eu reexportar esse banco de dados, ele voltará à forma original de 2 elementos SqlRule - um que contém as colunas e outro que contém a vinculação da regra.


Atualizar

O problema também acontece com o Az CLI:

PS> az version
{
  "azure-cli": "2.56.0",
  "azure-cli-core": "2.56.0",
  "azure-cli-telemetry": "1.1.0",
  "extensions": {
    "storage-preview": "1.0.0b1"
  }
}

PS> az sql db export `
  --subscription     "My Subscription" `
  --resource-group   "my-resource-group" `
  --server           "my-sql-server" `
  --name             "ProGet" `
  --admin-user       "my-admin-user" `
  --admin-password   "my-admin-password" `
  --storage-uri      "https://mystorageaccount.blob.core.windows.net/proget-db-backups/proget.bacpac" ``
  --storage-key-type "StorageAccessKey" `
  --storage-key      "my storage key"

Baixar o blob e descompactá-lo mostra o problema com vários SqlRule Elements.


Recapitular

Se você chegou até aqui, obrigado pela leitura, e só para recapitular, minha pergunta no "tl; dr" no topo foi:

  • Parte 1 : Estou fazendo algo errado ou isso é um bug conhecido (ou novo)?
  • Parte 2 : Se for um bug, você tem alguma ideia de onde posso reportá-lo?

Qualquer ajuda será muito apreciada.

sql-server
  • 1 1 respostas
  • 43 Views

1 respostas

  • Voted
  1. Best Answer
    mclayton
    2024-01-12T18:22:27+08:002024-01-12T18:22:27+08:00

    dr.

    Baixe e use o SqlPackage.exeutilitário de linha de comando mais recente em vez de SSMS ou azCLI - ele possui uma versão posterior da biblioteca DacFx que inclui uma correção para esse problema específico.

    Referências

    Então, depois de um dia inteiro de escavação, parece que este é realmente um problema conhecido:

    Microsoft/DacFX

    • problema nº 245 - Falha na publicação do arquivo DACPAC devido à regra de vinculação com um tipo de dados * definido pelo usuário

    Quando cx tenta publicar um arquivo DACPAC em um banco de dados existente (Azure SQL MI) que possui uma regra de ligação com um tipo de dados definido pelo usuário, eles receberão o erro: SQL72018: SqlRule não pôde ser importado, mas um ou mais desses objetos existem em sua origem .

    É um código de erro diferente - SQL72018 em vez de SQL72014, mas exatamente o mesmo problema.

    Também parece que foi corrigido nesta versão:

    162.0.52 SqlPackage

    Conserta

    • Deployment - Fixes an issue where deployment would fail when the target database contains a rule bound to a column with a user-defined type. GitHub issue

    I don't know how to check the exact version of the SqlPackage / DacFx components being used by SSMS, but I'm seeing the issue in SSMS version 19.3.4.0 which is the latest version as the time of writing.


    Workaround

    One workaround is to download and install the latest standalone SqlPackage tool and use that on the command-line instead:

    Download and install SqlPackage

    dotnet tool install -g microsoft.sqlpackage

    On Windows this installs it to %USERPROFILE%\.dotnet\tools\sqlpackage.exe which is in the %PATH% variable (at least it is on my machine) so it can be invoked with something like this to export the bacpac:

    PS> SqlPackage.exe -version
    162.1.172.1
    
    PS> SqlPackage.exe `
      /SourceConnectionString:"Server=(local);Database=ProGet;Trusted_Connection=True;TrustServerCertificate=True;" `
      /Action:Export `
      /TargetFile:"c:\temp\proget-sqlpackage.bacpac" `
      /OverwriteFiles:True
    

    Esta versão inclui uma correção para o problema do GitHub, portanto gera um arquivo backpac válido com o esquema da pergunta original:

    modelo.xml

    ... snip ...
    <Element Type="SqlRule" Name="[dbo].[YNINDICATOR_Domain]">
        <Property Name="ExpressionScript">
            <Value><![CDATA[@Ind COLLATE Latin1_General_BIN IN ('Y', 'N')]]></Value>
        </Property>
        <Relationship Name="BoundTargets">
            <Entry>
                <References Name="[dbo].[CustomLanguages].[Active_Indicator]" />
            </Entry>
            <Entry>
                <References Name="[dbo].[ClusterNodes].[Primary_Indicator]" />
            </Entry>
            <Entry>
                <References Name="[dbo].[YNINDICATOR]" />
            </Entry>
        </Relationship>
        <Relationship Name="Schema">
            <Entry>
                <References ExternalSource="BuiltIns" Name="[dbo]" />
            </Entry>
        </Relationship>
    </Element>
    ... snip ...
    

    As referências de coluna e UDT agora são todas geradas em um único <Element Type="SqlRule" ...nó, que é importado com sucesso.

    • 0

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