কোনও টেবিলে সারি সর্বাধিক সংখ্যার সীমাবদ্ধ করতে কীভাবে 1


22

আমার আমার এসকিউএল সার্ভার ডাটাবেসে একটি কনফিগারেশন টেবিল রয়েছে এবং এই টেবিলটির কেবল কখনও এক সারি থাকা উচিত। ভবিষ্যতের বিকাশকারীদের এটি বুঝতে সহায়তা করতে আমি একাধিক সারির ডেটা যুক্ত হওয়া রোধ করতে চাই। আমি নীচের মত এটির জন্য একটি ট্রিগার ব্যবহার করা বেছে নিয়েছি ...

ALTER TRIGGER OnlyOneConfigRow
    ON [dbo].[Configuration]
    INSTEAD OF INSERT
AS
BEGIN
    DECLARE @HasZeroRows BIT;
    SELECT  @HasZeroRows = CASE
        WHEN COUNT (Id) = 0 THEN 1
        ELSE 0
    END
    FROM
        [dbo].[Configuration];

    IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
    BEGIN
        RAISERROR ('You should not add more than one row into the config table. ', 16, 1)    
    END
END

এটি কোনও ত্রুটি ছুঁড়ে না তবে প্রথম সারিতে প্রবেশ করতে দিচ্ছে না।

এছাড়াও সারণীর সংখ্যা সীমাবদ্ধ করার আরও কার্যকর / আরও বেশি স্ব-ব্যাখ্যা করার উপায় আছে যেটি কেবলমাত্র 1 এ সারণিতে সন্নিবেশ করা যায়? আমি কি এসকিউএল সার্ভার বৈশিষ্ট্যটি অন্তর্নিহিত করছি?


2
আপনার আসল পদ্ধতির কেন কাজ হচ্ছে না তার একটি ব্যাখ্যা হিসাবে: আপনি ট্রিগার পরিবর্তে একটি ব্যবহার করেন, যার অর্থ আপনার কোডটি sertোকানো বিবৃতিটির পরিবর্তে চালানো হয়। সন্নিবেশ ঘটতে যাতে আপনার স্পষ্টতই এটিকে ট্রিগারটির অংশ হিসাবে অন্তর্ভুক্ত করতে হবে।
স্কট এম

উত্তর:


52

এই দুটি সীমাবদ্ধতাগুলি করবে:

CREATE TABLE dbo.Configuration
( ConfigurationID TINYINT NOT NULL DEFAULT 1,
  -- the rest of the columns
  CONSTRAINT Configuration_PK 
    PRIMARY KEY (ConfigurationID),
  CONSTRAINT Configuration_OnlyOneRow 
    CHECK (ConfigurationID = 1)
) ;

আপনার উভয়ই PRIMARY KEY(বা একটি UNIQUEসীমাবদ্ধতা) প্রয়োজন তাই কোনও দুটি সারির IDমান একই রকম হবে না , এবং CHECKসীমাবদ্ধতার ফলে সমস্ত সারির একই IDমান রয়েছে (নির্বিচারে বেছে নেওয়া হয়েছে 1)।
সংমিশ্রণে, প্রায় দুটি বিপরীত সীমাবদ্ধতা সারিগুলির সংখ্যা শূন্য বা একটিতে সীমাবদ্ধ করে।


একটি কাল্পনিক ডিবিএমএসে (কোনও বর্তমান এসকিউএল বাস্তবায়ন এই নির্মাণের অনুমতি দেয় না) যে 0 টি কলামযুক্ত একটি প্রাথমিক কীটিকে অনুমতি দেয়, এটিও একটি সমাধান হতে পারে:

CREATE TABLE dbo.Configuration
( -- no ConfigurationID needed at all
  -- the rest of the columns
  CONSTRAINT Configuration_PK 
    PRIMARY KEY ()                -- 0 columns!
) ;

24

আপনি একটি ধ্রুবক মানকে মূল্যায়ন করে গণনা করা কলাম হিসাবে আইডি সংজ্ঞায়িত করতে পারেন এবং সেই কলামটি অনন্য বলে ঘোষণা করতে পারেন:

CREATE TABLE dbo.Configuration
(
  ID AS CAST(1 AS tinyint),  -- or: AS bit
  ...  -- other columns
  CONSTRAINT UQ_Configuration_ID UNIQUE (ID)
);

9

আপনি ট্রিগার ব্যবহার করতে পারেন ..

create trigger LimitTable
on YourTableToLimit
after insert
as
    declare @tableCount int
    select @tableCount = Count(*)
    from YourTableToLimit

    if @tableCount > 50
    begin
        rollback
    end
go

1

কিছুটা অদ্ভুত প্রয়োজন বলে মনে হয় তবে হো-হুম :) আপনি কেবল টেবিলে সীমাবদ্ধতা রাখতে পারেন এবং তারপরে কেবলমাত্র টেবিলটিতে আপডেট (কোনও সন্নিবেশ বা মোছা) অনুমতি দেবেন না?

CREATE TABLE dbo.Config (
    ID INT identity(1,1), 
    CONFIGURATION VARCHAR(MAX),
    constraint ck_limitrows CHECK (ID <=1) 
    );

এটি করা কিছুটা হ্যাকি উপায় হলেও, কেবলমাত্র কোনও স্টোরেজ পদ্ধতির মাধ্যমে কনফিগারেশনের পরিবর্তনগুলি প্রয়োগ করা ভাল নয় যা তখন আপনার জন্য এই সমস্ত যুক্তি পরিচালনা করতে পারে?


2
কেবল নিশ্চিত করুন যে কেউ টেবিল থেকে মুছতে পারে না। যদি কেউ মুছে ফেলে এবং তারপরে পুনরায় toোকানোর চেষ্টা করে তবে এটি 2 এর পরিচয় দিয়ে সন্নিবেশ করার চেষ্টা করবে যা এটি অনুমতি দেয় না।
মাদুর

5
এটির IDএকটি মান 0বা negative ণাত্মক মানতে নিষেধ করে না । এবং @ ম্যাট পয়েন্ট হিসাবে, যদি আপনি প্রথমটি মুছে ফেলা হয় তবে আপনি অন্য সারি সন্নিবেশ করানোর চেষ্টা করলে এটি ব্যর্থ হবে।
ypercubeᵀᴹ

2
একটি "বিজোড় প্রয়োজন" হিসাবে, আমি আপাতদৃষ্টিতে আরও সাধারণ EAV ডিজাইনের পরিবর্তে কনফিগারেশন সেটিংসের জন্য একটি একক-সারি টেবিল ব্যবহার করতে পছন্দ করি । আগেরটি হ'ল সুবিধাটি যে কলামগুলি একটি উপযুক্ত ডেটা টাইপ দিয়ে তৈরি করা যায় এবং উপযুক্ত সীমাবদ্ধতা যুক্ত করা যায় (আরও সহজেই)।
কেনি এভিট

2
আমার আগের মন্তব্যে আমি খুব একটা পরিষ্কার ছিলাম না। "এর ফলে আইডিটির মান 0 বা negative ণাত্মক হতে মানায় না" এর একটি পার্শ্ব প্রতিক্রিয়া হ'ল টেবিলটি 2 বা ততোধিক সারি দিয়ে শেষ হতে পারে। পরিচয়ের সম্পত্তি অনন্য বাধা বোঝায় না।
ypercubeᵀᴹ

3
@ ইপারকিউবিᵀᴹ কী বলেছে তা উদাহরণস্বরূপ, এই সমাধানের সাহায্যে আপনি উদাহরণস্বরূপ INSERT INTO dbo.Config DEFAULT VALUES;একবার মাত্র করতে পারেন তবে আপনি এটি SET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF; বেশ কয়েকবার অনুসরণ করতে পারেন এবং আপনি একাধিক সারি সারণীটি শেষ করতে পারেন।
অ্যান্ড্রি এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.