Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

कैसे ठीक करें "वैकल्पिक तालिका स्विच विवरण विफल" संदेश 4982 (एसक्यूएल सर्वर)

यदि आपको SQL सर्वर में त्रुटि संदेश 4982 मिलता है, तो ऐसा इसलिए है क्योंकि आपकी स्रोत तालिका में कोई बाधा नहीं है जो डेटा को केवल उस विभाजन द्वारा समर्थित सीमा तक सीमित करती है जिस पर आप स्विच करने का प्रयास कर रहे हैं।

त्रुटि का उदाहरण

यहाँ त्रुटि कैसी दिखती है:

Msg 4982, Level 16, State 1, Line 1
ALTER TABLE SWITCH statement failed. Check constraints of source table 'Test.dbo.OrdersOld' allow values that are not allowed by range defined by partition 3 on target table 'Test.dbo.OrdersNew'.

सटीक शब्दांकन आपके टेबल के नाम, विभाजन, पर्यावरण, आदि पर निर्भर करेगा।

जब आप डेटा को किसी नए पार्टीशन में स्विच करने का प्रयास करते हैं, तो आप यह सुनिश्चित करना चाहते हैं कि डेटा उस पार्टीशन की श्रेणी का पालन करता है। उदाहरण के लिए, यदि आपके विभाजन में 1 से 10 की सीमा है, तो आप गलती से 11 और 20 के बीच मान नहीं रखना चाहते।

SQL सर्वर भी सुनिश्चित होना चाहता है, और इसीलिए आपको यह त्रुटि मिलती है। जब आप डेटा स्विच करने का प्रयास करते हैं, तो SQL सर्वर CHECK . के लिए स्रोत तालिका को देखता है बाधा जो डेटा को गंतव्य विभाजन में निर्दिष्ट सीमा तक सीमित करती है। अगर उसे कोई नहीं मिलता है, तो आपको यह त्रुटि मिलती है।

इसे ठीक करने के लिए, एक CHECK जोड़ें स्रोत तालिका के लिए बाधा, और सुनिश्चित करें कि यह डेटा को उस विभाजन द्वारा समर्थित सीमा तक सीमित करता है जिस पर आप स्विच कर रहे हैं।

समस्या कोड का उदाहरण

यहाँ वह कोड है जिसके कारण त्रुटि हुई:

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg1dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg2dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg3dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg3dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg4;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg4dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg4dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg4;
GO

CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401'
    );
GO

CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    TO (
        OrdersNewFg1,
        OrdersNewFg2,
        OrdersNewFg3,
        OrdersNewFg4
        );  
GO

CREATE TABLE OrdersOld (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
    CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate,OrderId)
    )
    ON OrdersNewFg3;
GO

INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
    ('20200302', 'Cat food'),
    ('20200315', 'Water bowl'),
    ('20200318', 'Saddle for camel'),
    ('20200321', 'Dog biscuits'),
    ('20200328', 'Bigfoot shoes');
GO

CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate),
    CONSTRAINT PKOrdersNew PRIMARY KEY CLUSTERED(OrderDate,OrderId);  
GO

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

परिणाम:

Msg 4982, Level 16, State 1, Line 1
ALTER TABLE SWITCH statement failed. Check constraints of source table 'Test.dbo.OrdersOld' allow values that are not allowed by range defined by partition 3 on target table 'Test.dbo.OrdersNew'.

समाधान

यहाँ वही कोड है लेकिन इस बार उपयुक्त CHECK . के साथ बाधा जोड़ी गई।

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg1dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg2dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg3dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg3dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg4;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg4dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg4dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg4;
GO

CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401'
    );
GO

CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    TO (
        OrdersNewFg1,
        OrdersNewFg2,
        OrdersNewFg3,
        OrdersNewFg4
        );  
GO

CREATE TABLE OrdersOld (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
    CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )
    ON OrdersNewFg3;
GO

INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
    ('20200302', 'Cat food'),
    ('20200315', 'Water bowl'),
    ('20200318', 'Saddle for camel'),
    ('20200321', 'Dog biscuits'),
    ('20200328', 'Bigfoot shoes');
GO

CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersNew PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

परिणाम:

Commands completed successfully.

डेटा अब सफलतापूर्वक विभाजन में बदल दिया गया है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कर्सर का उपयोग किए बिना प्रत्येक पंक्ति के लिए SQL कॉल संग्रहीत प्रक्रिया

  2. CONVERT() दिनांक/समय से SQL सर्वर में स्ट्रिंग उदाहरणों के लिए

  3. कैसे जांचें कि SQL सर्वर में कोई डेटाबेस मौजूद है या नहीं?

  4. कॉलम के प्रत्येक अद्वितीय मान के लिए केवल पहली पंक्तियों का चयन कैसे करें?

  5. SQL सर्वर में समग्र प्राथमिक कुंजी बनाना