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 / 330402
Accepted
Sheikh Wasiu Al Hasib
Sheikh Wasiu Al Hasib
Asked: 2023-08-18 04:45:26 +0800 CST2023-08-18 04:45:26 +0800 CST 2023-08-18 04:45:26 +0800 CST

Não é possível SWITCH IN uma tabela particionada

  • 772

Eu criei duas tabelas, uma é OrdersLatest e outra é OrdersMarch . Quero mudar os dados da tabela particionada para a tabela intermediária ( OrdersMarch ) no mesmo grupo de arquivos e vice-versa.

Estava funcionando bem para desligar, mas problema ao ligar. Meu caso SWITCH IN não funciona

Ele mostra o erro abaixo, que indica uma incompatibilidade de restrição entre a tabela de origem e de destino ( OrdersMarch ). Não tenho certeza do que devo alterar para resolver esse erro.

Eu verifiquei a partição esquerda e direita, mas o problema é o mesmo. Defino restrições na tabela intermediária ( OrdersMarch ) na coluna particionada também, mas o erro é o mesmo. Qualquer um pode resolver esse problema, onde está o problema exato?

A instrução ALTER TABLE SWITCH falhou. Verifique restrições ou função de partição da tabela de origem 'TEST.dbo.OrdersMarch' permite valores que não são permitidos por restrições de verificação ou função de partição na tabela de destino 'TEST.dbo.OrdersLatest'.

função de partição

CREATE PARTITION FUNCTION OrdersLatestPartitionFunction (datetime)  
    AS RANGE RIGHT FOR VALUES (
        '20180101', 
        '20190101',
        '20200101'
    );
GO

Esquema de Partição

CREATE PARTITION SCHEME OrdersLatestPartitionScheme
    AS PARTITION OrdersLatestPartitionFunction  
    TO (
        OrdersLatestFg1,
        OrdersLatestFg2,
        OrdersLatestFg3,
        OrdersLatestFg4
        );  
GO

Criar a tabela

CREATE TABLE OrdersLatest (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersLatest PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )  
    ON OrdersLatestPartitionScheme(OrderDate);  
GO

Alternar tabela de destino

CREATE TABLE OrdersMarch (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )
    ON OrdersLatestFg3;
GO

Inserção de dados

INSERT INTO OrdersLatest(OrderDate, OrderDesc) VALUES
    ('20190302', 'Cat food'),
    ('20190315', 'Water bowl'),
    ('20190318', 'Saddle for camel'),
    ('20190321', 'Dog biscuits'),
    ('20190328', 'Bigfoot shoes');
GO

Saída Após a Inserção

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg1 | 0      |
| 2           | OrdersLatestFg2 | 0      |
| 3           | OrdersLatestFg3 | 5      |
| 4           | OrdersLatestFg4 | 0      |
+-------------+-----------------+--------+

Troque

ALTER TABLE OrdersLatest SWITCH PARTITION 3 TO OrdersMarch;

Saída Após Interruptor

+-------------+-----------------+--------+
| Partition   | Filegroup       | Rows   |
|-------------+-----------------+--------|
| 1           | OrdersLatestFg1 | 0      |
| 2           | OrdersLatestFg2 | 0      |
| 3           | OrdersLatestFg3 | 0      |
| 4           | OrdersLatestFg4 | 0      |
+-------------+-----------------+--------+

Alternar em

ALTER TABLE OrdersMarch SWITCH TO OrdersLatest PARTITION 3; 

A instrução ALTER TABLE SWITCH falhou. Verifique restrições ou função de partição da tabela de origem 'TEST.dbo.OrdersMarch' permite valores que não são permitidos por restrições de verificação ou função de partição na tabela de destino 'TEST.dbo.OrdersLatest'.

sql-server
  • 1 1 respostas
  • 40 Views

1 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2023-08-18T09:58:34+08:002023-08-18T09:58:34+08:00

    O SQL Server requer que os dados de origem estejam dentro dos limites da partição de destino para inserir SWITCHos dados em uma tabela particionada. Isso pode ser garantido antecipadamente com um desses métodos, como sugere a mensagem de erro.

    Método 1:

    Crie uma restrição de verificação na tabela de origem não particionada para corresponder (ou ser um subconjunto) aos limites da partição de destino. A restrição de verificação para a partição 3 do seu RANGE RIGHTcenário é:

    ALTER TABLE OrdersMarch
    ADD CONSTRAINT CK_OrdersMarch_OrderDate
    CHECK (OrderDate >= '20190101' AND OrderDate < '20200101');
    

    Essa restrição de verificação permitirá que você mude a OrdersMarchtabela para OrdersLatesta partição 3.

    Observe que uma restrição de verificação na tabela de preparação é obrigatória apenas quando a tabela de preparação é alternada para a partição da tabela principal; não é necessário quando você alterna uma partição para a tabela intermediária, mas, se existir, a expressão de restrição de verificação deve ser a mesma (ou um superconjunto) dos limites da partição de origem. Lembre-se disso se usar a mesma tabela de preparação para diferentes partições. Uma expressão de restrição de verificação diferente é necessária para cada partição. Acho o método 2 mais fácil, pois evita a necessidade de (re)criar restrições de verificação na tabela de preparação.

    Método 2:

    Particione a tabela de preparação com a mesma (ou semelhante) função/esquema de partição de forma que os limites da partição da tabela de origem sejam os mesmos (ou subconjuntos) da partição de destino. Isso também garante que as partições de origem e destino estejam alinhadas ao armazenamento, outro pré-requisito de particionamento para arquivos SWITCH.

    CREATE TABLE OrdersMarch (
        OrderDate datetime NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL,
        CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    ) ON OrdersLatestPartitionScheme(OrderDate);
    

    Os dados podem então ser transferidos para a partição de destino especificando também o número da partição de origem:

    ALTER TABLE OrdersMarch SWITCH PARTITION 3 TO OrdersLatest PARTITION 3;
    

    Observe que alterei o tipo de dados da coluna OrderDate de datepara datetimeneste exemplo para corresponder à sua função de partição. O tipo de dados da coluna de particionamento deve corresponder ao da função de partição, portanto, parece que há um erro de digitação em sua pergunta DDL.

    • 4

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