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'.
O SQL Server requer que os dados de origem estejam dentro dos limites da partição de destino para inserir
SWITCH
os 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 RIGHT
cenário é:Essa restrição de verificação permitirá que você mude a
OrdersMarch
tabela paraOrdersLatest
a 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
.Os dados podem então ser transferidos para a partição de destino especificando também o número da partição de origem:
Observe que alterei o tipo de dados da coluna OrderDate de
date
paradatetime
neste 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.