টেবিল পরিবর্তন করুন ... নিয়মিত টেবিল থেকে পার্টিশনযুক্ত টেবিলের দিকে সুইচিং ব্যর্থ


9

নীচের কোডটি নিম্নলিখিতটি করে:

  1. সি: EM টিইএমপি তে একটি ডাটাবেস প্লে_ বিভাগ তৈরি করে
  2. দুটি অভিন্ন বিভাজনযুক্ত টেবিল তৈরি করে প্লে_ টেবিল এবং সংরক্ষণাগার_প্লে_ টেবিল
  3. প্লে-টেবিল পার্টিশন 1 টি আর্কাইভ_প্লে_ট্যাবল পার্টিশন 1 এ স্যুইচ করে
  4. Play_table পার্টিশন 2 এর মতো একই ফাইলগ্রুপে প্লে_ টেবিলের মতো একই কাঠামো সহ একটি অবিভাজনযুক্ত টেবিল অস্থায়ী_সামগ্রী তৈরি করে
  5. টেম্প্লেট-টেবিলটিতে প্লে_সামান্য_বিভাজন 2 স্যুইচ করে
  6. অস্থায়ী_সামগ্রীটিকে প্লে_ট্যাবল পার্টিশন 2 এ ফিরে যেতে চেষ্টা করে এবং এতে ব্যর্থ হয়

    এমএসজি 4982, স্তর 16, রাজ্য 1, লাইন 64 টেবিল সুইচ বিবৃতি ব্যর্থ হয়েছে। উত্স টেবিলের সীমাবদ্ধতাগুলি পরীক্ষা করুন 'play_partition.dbo.temp_table' যে মানগুলিকে লক্ষ্য টেবিল 'play_partition.dbo.play_table' তে পার্টিশন 2 দ্বারা নির্ধারিত সীমার দ্বারা অনুমোদিত নয়।

কেন এটি ব্যর্থ হয়?

আমি এসকিউএল সার্ভার 2014 (এন্টারপ্রাইজ সংস্করণ পরীক্ষা) ব্যবহার করছি।

শুভেচ্ছা সহ,

কলিন ডেলি

http://www.colindaley.com/translator

/* Playing with partitioned tables */

USE master;
GO

DROP DATABASE play_partition;
GO

CREATE DATABASE play_partition
    ON PRIMARY(
        NAME = play_partition
        , FILENAME = 'C:\TEMP\play_partition.mdf')
    ,FILEGROUP play_fg1(
        NAME = play_fg1
        ,FILENAME = 'C:\TEMP\play_fg1f1.ndf')
    ,FILEGROUP play_fg2(
        NAME = play_fg2f1
        ,FILENAME = 'C:\TEMP\play_fg2f1.ndf');
GO

USE play_partition;


CREATE PARTITION FUNCTION play_range(INT)
    AS RANGE LEFT FOR VALUES(3);

-- Partition scheme
CREATE PARTITION SCHEME play_scheme 
    AS PARTITION play_range TO (play_fg1, play_fg2);

-- Partitioned tables
CREATE TABLE dbo.play_table(
    c1 INT NOT NULL CONSTRAINT PK_play_table_c1 PRIMARY KEY CLUSTERED
)
    ON play_scheme(c1);

CREATE TABLE dbo.archive_play_table(
c1 INT NOT NULL CONSTRAINT PK_archive_play_table_c1 PRIMARY KEY CLUSTERED
)
    ON play_scheme(c1);

-- partition 1 = {1, 2, 3}, partiion 2 = {4, 5, 6}
INSERT INTO dbo.play_table(c1) VALUES (1), (2),  (3), (4), (5), (6);

-- move partition 1 from play_table to archive play_table
ALTER TABLE dbo.play_table
    SWITCH PARTITION 1 to dbo.archive_play_table PARTITION 1;

-- create empty table with same structure as dbo.play_table
SELECT * INTO dbo.temp_table FROM dbo.play_table WHERE 1 = 0;

-- move temp_table to filegroup play_fg2
ALTER TABLE dbo.temp_table
    ADD CONSTRAINT PK_temp_table_c1 PRIMARY KEY CLUSTERED(c1) ON play_fg2;

-- move contents of play_table to temp_table, which is not partitioned
-- but is in the same filegroup
ALTER TABLE dbo.play_table
    SWITCH PARTITION 2 TO temp_table;
PRINT 'Switched from partitioned table to non-partitioned table';

-- move data back to partitioned play_table from unpartitioned temp_table
-- FAIL
ALTER TABLE dbo.temp_table
    SWITCH TO play_table partition 2;
PRINT 'Switched from non-partitioned table to partitioned table';


SELECT 'archive_play_table' as table_name, t1.c1
    FROM dbo.archive_play_table AS t1
    UNION ALL
    SELECT 'temp_table' AS table_name, t1.c1
        FROM dbo.temp_table as t1
    ORDER BY 1, 2;

আপনার প্রশ্নে +1। আপনি এখানে রেখেছেন ডিডিএলের কারণে আপনি তিরস্কার ও উত্তর দেওয়া সহজ করেছেন। তার জন্য, আপনাকে ধন্যবাদ। আমি আশা করি আমি এই জাতীয় +10 প্রশ্ন করতে পারে।
টমাস স্ট্রিংগার

ধন্যবাদ। এই ত্রুটির একটি আরও ভাল বার্তা প্রয়োজন। যখন এটি টেবিলে চেক সীমাবদ্ধতার কথা উল্লেখ করেছিল (যখন কোনও চেক সীমাবদ্ধতা ছিল না), আমার কাছে এমনটি ঘটে নি যে চেক সীমাবদ্ধতার অভাব ছিল আসলে, সমস্যা ছিল।
কলিন ডেলি

উত্তর:


11

আপনি যখন পার্টিশন স্যুইচিংয়ের সাথে কাজ করছেন, এসকিউএল সার্ভারকে যাচাই করা দরকার যে উত্স টেবিল / পার্টিশন সীমানা গন্তব্য সারণী / পার্টিশনের সীমানায় ফিট করতে পারে। অন্য কথায়, আপনার কাছ থেকে সুইচ ডেটাতে চেষ্টা করছেন dbo.temp_tableকরার dbo.play_table'র পার্টিশন 2. ভালো মনে করি, জন্য তথ্য c1মধ্যে dbo.temp_tableশুধুমাত্র ডাটা টাইপ (দ্বারা সীমাবদ্ধ int), তাই আপনি -2.147.483.648 থেকে 2.147.483.647 পর্যন্ত মান থাকতে পারে । তবে বিপরীতে, আপনার গন্তব্য ( dbo.play_tableপার্টিশন 2) এর পরিধি 4 থেকে 2,147,483,647 রয়েছে।

আপনার ডেটা এটি লঙ্ঘন করে না, তবে এটি এমন মেটাডেটা যা এটির অনুমতি দেয় না। আপনি ঠিক তেমন সহজেই -10 এর মান সন্নিবেশ করতে পারেন dbo.temp_table। পার্টিশন স্যুইচিং একইভাবে ব্যর্থ হবে এবং আরও অর্থবোধ তৈরি করবে, কারণ -10 dbo.play_tableএর 2 য় পার্টিশনের সীমানায় ফিট করে না ।

আপনি যদি এই কোডটি কাজ করতে চান, আপনার স্পষ্টতই এসকিউএল সার্ভারকে জানাতে dbo.temp_tableহবে যেগুলির এমন কোনও ডেটা থাকবে না যা dbo.play_tableএর 2 য় পার্টিশনের সাথে খাপ খায় না । আপনি চেক সীমাবদ্ধতার সাথে এটি করতে পারেন:

/******************************************************************************
    your code omitted for brevity
******************************************************************************/

-- move contents of play_table to temp_table, which is not partitioned
-- but is in the same filegroup
ALTER TABLE dbo.play_table
    SWITCH PARTITION 2 TO temp_table;
PRINT 'Switched from partitioned table to non-partitioned table';

/******************************************************************************
    added check constraint so that data can fit in the destination partition
******************************************************************************/
alter table dbo.temp_table
add constraint CK_TempTable_C1 check (c1 >= 4);
go
/******************************************************************************
    end of added code
******************************************************************************/

-- move data back to partitioned play_table from unpartitioned temp_table
-- this will no longer FAIL
ALTER TABLE dbo.temp_table
    SWITCH TO play_table partition 2;
PRINT 'Switched from non-partitioned table to partitioned table';

/******************************************************************************
    your code omitted for brevity
******************************************************************************/

আপনার কোডে এটির উপরে নমুনা সংযোজন এটি একটি কার্যকর সমাধান করে তোলে। এখন এসকিউএল সার্ভার জানে যে এতে থাকা চেক সীমাবদ্ধতার কারণে ডেটা dbo.temp_tableপার্টিশন 2-এ ফিট করতে dbo.play_tableপারে dbo.temp_table

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.