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 / user-38603

mclayton's questions

Martin Hope
mclayton
Asked: 2024-01-12 06:15:50 +0800 CST

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

  • 5

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 respostas
  • 43 Views
Martin Hope
mclayton
Asked: 2014-05-20 04:21:30 +0800 CST

MongoDB - Adicionando um novo servidor a um conjunto de réplicas existente com autenticação habilitada

  • 4

Versão curta : Existe uma maneira de adicionar um novo servidor SECONDARY a um conjunto de réplicas do MongoDB de produção existente sem tempo de inatividade e sem desabilitar temporariamente as configurações de "auth" e "keyfile" nos servidores existentes?

Versão longa : Meu ambiente de produção atual consiste em três servidores Windows 2012 R2 DataCenter executando o MongoDB versão 2.4.9 como um serviço:

PRIMARY   - ServerA.example.org:27017
SECONDARY - ServerB.example.org:27017
ARBITER   - ServerC.example.org:27017

Eu tenho duas contas de usuário do MongoDB no ambiente:

{ "_id" : ObjectId("XXXXXXXXXX"), "pwd" : "XXXXXXXXXX", "user" : "mongo-admin", "roles" : [  "userAdminAnyDatabase" ] }
{ "_id" : ObjectId("XXXXXXXXXX"), "pwd" : "XXXXXXXXXX", "user" : "mongo-cluster-admin", "roles" : [  "clusterAdmin" ] }

E o arquivo de configuração nos servidores existentes se parece com isso:

logpath=C:\mongo\logs\mongo.log
dbpath=C:\mongo\data
replSet=rs
oplogSize=700
port=27017
auth=true
keyFile=C:\mongo\config\keyfile.txt

Desejo adicionar ServerD e ServerE como novos servidores SECONDARY.

Eu tentei o seguinte na minha estação de trabalho e no console local no ServerA, com e sem o "auth" e o "keyfile" na configuração do ServerD, mas obtive o mesmo resultado em todos os casos:

D:\MongoDB\bin>mongo ServerA.example.org:27017
MongoDB shell version: 2.4.7
connecting to: ServerA.example.org:27017/test
> use admin
switched to db admin
> db.auth("mongo-cluster-admin", "XXXXXXXXXX")
1
rs:PRIMARY> rs.add("ServerD.example.org:27017")
Mon May 19 11:41:42.050 count failed: { "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/query.js:180

A única maneira de fazer isso funcionar em um ambiente de teste é desabilitar as configurações "auth" e "keyfile" em todos os cinco servidores e adicionar os novos servidores ao conjunto de réplicas usando "rs.add() " no PRIMARY e, finalmente, reative "auth" e "keyfile" em todos os servidores. Isso requer algumas reinicializações do serviço MongoDB em cada caixa para atualizar as configurações, o que eu realmente quero evitar.

Existe uma maneira de adicionar os novos servidores SECONDARY ao conjunto de réplicas sem alterar primeiro as configurações de "auth" e "keyfile" nos servidores existentes?

mongodb replication
  • 1 respostas
  • 5506 Views

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