INFORMATION_SCHEMA ব্যবহার করে আমি কীভাবে একটি ডিফল্ট সীমাবদ্ধতা পাই?


116

আমি প্রদত্ত ডিফল্ট সীমাবদ্ধতা উপস্থিত থাকলে পরীক্ষার চেষ্টা করছি। আমি সিসোবজেক্টস টেবিলটি ব্যবহার করতে চাই না, তবে আরও মানক INFORMATION_SCHEMA।

আমি এটি আগে সারণী এবং প্রাথমিক কী বাধাগুলি পরীক্ষা করার জন্য ব্যবহার করেছি তবে আমি কোথাও ডিফল্ট সীমাবদ্ধতা দেখতে পাচ্ছি না।

তারা কি সেখানে নেই? (আমি এমএস এসকিউএল সার্ভার 2000 ব্যবহার করছি)।

সম্পাদনা: আমি সীমাবদ্ধতার নামটি পেতে চাই।

উত্তর:


121

যেহেতু আমি এটি বুঝতে পারি, ডিফল্ট মান সীমাবদ্ধতাগুলি আইএসও স্ট্যান্ডার্ডের অংশ নয়, সুতরাং তারা INFORMATION_SCHEMA তে উপস্থিত হয় না। INFORMATION_SCHEMA এই ধরণের টাস্কের জন্য সেরা পছন্দ বলে মনে হচ্ছে কারণ এটি ক্রস প্ল্যাটফর্ম, তবে যদি তথ্য না পাওয়া যায় তবে এসকিউএল সার্ভারে অবহেলিত সিস্টেম সারণী দর্শনগুলির পরিবর্তে অবজেক্ট ক্যাটালগ ভিউগুলি (সিএস। *) ব্যবহার করা উচিত one 2005 এবং পরে।

নীচে @ ব্যবহারকারী 186476 এর উত্তরের মতো প্রায় একই রকম। এটি প্রদত্ত কলামের জন্য ডিফল্ট মান সীমাবদ্ধতার নাম দেয়। (এস -কিউএল সার্ভারবিহীন ব্যবহারকারীদের জন্য, এটি ফেলে দেওয়ার জন্য আপনার ডিফল্টের নাম প্রয়োজন এবং আপনি যদি নিজের ডিফল্ট সীমাবদ্ধতার নাম না রাখেন তবে এসকিউএল সার্ভার "DF_TableN_Colum_95AFE4B5" এর মতো কিছু ক্রেজি নাম তৈরি করে change ভবিষ্যতে আপনার স্কিমা, সর্বদা স্পষ্টভাবে আপনার সীমাবদ্ধতার নাম দিন!)

-- returns name of a column's default value constraint 
SELECT
    default_constraints.name
FROM 
    sys.all_columns

        INNER JOIN
    sys.tables
        ON all_columns.object_id = tables.object_id

        INNER JOIN 
    sys.schemas
        ON tables.schema_id = schemas.schema_id

        INNER JOIN
    sys.default_constraints
        ON all_columns.default_object_id = default_constraints.object_id

WHERE 
        schemas.name = 'dbo'
    AND tables.name = 'tablename'
    AND all_columns.name = 'columnname'

1
দ্রষ্টব্য: বিভিন্ন স্কিমায় একই টেবিলের নাম থাকা সম্ভব, তাই আপনার sys.schemas টেবিলেও যোগ দেওয়া উচিত।
ড্যানিয়েল জেমস ব্রায়ার্স

1
@ ড্যানিয়েলজেমস ব্রায়ারস sys.schemas এখন অনুসন্ধানে যুক্ত হয়েছে।
স্টিফেন টার্নার

দয়া করে আমার উত্তরটি দেখুন যা সংক্ষিপ্ত এবং মিষ্টি, এসকিউএল সার্ভারের সমস্ত সংস্করণে কাজ করে, কোনও sysটেবিল দেয় না এবং এটি মনে রাখা সহজ।
এরিক

2
@ এরিক আপনার কোড ধরে নেয় ডিফল্ট সীমাবদ্ধতার নাম জানা যায়। এটি আপনার সমাধান হিসাবে সমাধান হিসাবে একটি সহজ সমস্যা। ভাল উত্তর, ভুল প্রশ্ন।
ডারলম

আমার কোডটি ধরে নিয়েছে, কারণ এটাই প্রশ্নকর্তা জিজ্ঞাসা করেছিলেন - "আমি সীমাবদ্ধতার নাম অনুসারে [একটি 'প্রদত্ত ডিফল্ট সীমাবদ্ধতা আছে কিনা'] তা খুঁজছি।" এর সরাসরি প্রশ্ন-সন্তোষজনক প্রকৃতিটি আরও স্পষ্ট করে তুলতে আমি আমার উত্তর সম্পাদনা করেছি। আশা করি এইটি কাজ করবে.
এরিক

43

ডিফল্ট সীমাবদ্ধতার সাথে সংযুক্তি সারণীর নাম এবং কলামের নাম উল্লেখ করে ফলাফলগুলি আরও সংকীর্ণ করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

select * from sysobjects o 
inner join syscolumns c
on o.id = c.cdefault
inner join sysobjects t
on c.id = t.id
where o.xtype = 'D'
and c.name = 'Column_Name'
and t.name = 'Table_Name'

1
আমি কয়েক ঘন্টা ধরে এই সাধারণ ক্যোয়ারীটি অনুসন্ধান করি। থান্নন্নক্ক ইউউউউ!
স্যামুয়েল

ইসন কেস সেনসিটিভ ডাটাবেস কাজ করতে o.xtype = 'D' থাকতে হবে।
ইভানএইচ

37

ভিউগুলিতে কোনও ডিফল্ট সীমাবদ্ধ নাম নেই বলে মনে হচ্ছে Information_Schema

SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name নামে একটি ডিফল্ট সীমাবদ্ধতা সন্ধান করতে ব্যবহার করুন


ঠিক যেটা আমার দরকার ছিল. ধন্যবাদ
drdwilcox

পরবর্তী বিকল্পগুলির চেয়ে সরাসরি প্রশ্নের উত্তর দেয় (এসকিউএল 2000 এবং সীমাবদ্ধ নাম অনুসারে কোয়েরি)।
মার্ক এল।

এটি কেবল তখনই কার্যকর হয় যখন আপনি সীমাবদ্ধতার নাম জানেন তবে যদি এটি নির্ধারিত সিস্টেমে ....
টিএস

12

নীচের স্ক্রিপ্টটি সমস্ত ডিফল্ট সীমাবদ্ধতা এবং ব্যবহারকারীর সারণীর জন্য ডিফল্ট মানগুলি এটি ডাটাবেসে চালাচ্ছে:

SELECT  
        b.name AS TABLE_NAME,
        d.name AS COLUMN_NAME,
        a.name AS CONSTRAINT_NAME,
        c.text AS DEFAULT_VALUE
FROM sys.sysobjects a INNER JOIN
        (SELECT name, id
         FROM sys.sysobjects 
         WHERE xtype = 'U') b on (a.parent_obj = b.id)
                      INNER JOIN sys.syscomments c ON (a.id = c.id)
                      INNER JOIN sys.syscolumns d ON (d.cdefault = a.id)                                          
 WHERE a.xtype = 'D'        
 ORDER BY b.name, a.name

5

আপনি যদি কলাম বা টেবিলের নামগুলি দ্বারা কোনও সীমাবদ্ধতা পেতে চান বা আপনি ডাটাবেসে সমস্ত সীমাবদ্ধতা পেতে চান তবে অন্যান্য উত্তরের দিকে লক্ষ্য করুন। তবে, যদি আপনি কেবল প্রশ্নটি যা ঠিক জিজ্ঞাসা করছেন, যেমন "যদি কোনও প্রদত্ত ডিফল্ট সীমাবদ্ধতা উপস্থিত থাকে ... সীমাবদ্ধতার নামে" পরীক্ষা করে দেখেন , তবে আরও সহজ উপায় আছে।

এখানে ভবিষ্যতের প্রুফের উত্তর যা কোনও sysobjectsবা অন্য sysটেবিলগুলি মোটেই ব্যবহার করে না :

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END

3
select c.name, col.name from sys.default_constraints c
    inner join sys.columns col on col.default_object_id = c.object_id
    inner join sys.objects o  on o.object_id = c.parent_object_id
    inner join sys.schemas s on s.schema_id = o.schema_id
where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName

1
আরও কিছুটা সাদা জায়গা ভাল লাগবে, তবে এটি মূল পোস্টারটি অবজেক্ট ক্যাটালগ ভিউগুলি (সিস। *) ব্যবহার করে জিজ্ঞাসা করেছিল যা মাইক্রোসফ্ট পশ্চাদ-সামঞ্জস্যতা সিস্টেম সারণী দর্শনগুলির জন্য সুপারিশ করেছে।
রবার্ট ক্যালহাউন

2

আপনি যা খুঁজছেন INFORMATION_SCHEMA.COLUMNS এর COLUMN_DEFAULT কলামটি কি?


হ্যাঁ এবং না, এটি আমাকে জানিয়েছে একটি ডিফল্ট আছে এবং এটি কী, তবে আমারও বাধাটির নাম প্রয়োজন।
ওয়াইল্ডজো

1
এছাড়াও, সচেতন থাকুন যে যদি আপনার রানটাইম এসকিউএল লগইনটি ডিবিও স্কিমার মালিক না হয় তবে আপনি কেবল COLUMN_DEFAULT কলামে ন্যূন মানগুলি পেতে পারেন।
গ্লেন লিটল

1
WHILE EXISTS( 
    SELECT * FROM  sys.all_columns 
    INNER JOIN sys.tables ST  ON all_columns.object_id = ST.object_id
    INNER JOIN sys.schemas ON ST.schema_id = schemas.schema_id
    INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id
    WHERE 
    schemas.name = 'dbo'
    AND ST.name = 'MyTable'
)
BEGIN 
DECLARE @SQL NVARCHAR(MAX) = N'';

SET @SQL = (  SELECT TOP 1
     'ALTER TABLE ['+  schemas.name + '].[' + ST.name + '] DROP CONSTRAINT ' + default_constraints.name + ';'
   FROM 
      sys.all_columns

         INNER JOIN
      sys.tables ST
         ON all_columns.object_id = ST.object_id

         INNER JOIN 
      sys.schemas
         ON ST.schema_id = schemas.schema_id

         INNER JOIN
      sys.default_constraints
         ON all_columns.default_object_id = default_constraints.object_id

   WHERE 
         schemas.name = 'dbo'
      AND ST.name = 'MyTable'
      )
   PRINT @SQL
   EXECUTE sp_executesql @SQL 

   --End if Error 
   IF @@ERROR <> 0 
   BREAK
END 

1

Necromancing।
যদি আপনার কেবলমাত্র ডিফল্ট-সীমাবদ্ধতা উপস্থিত থাকে কিনা তা খতিয়ে দেখার দরকার
(ডিফল্ট-সীমাবদ্ধতাগুলির খারাপ নাম-পরিচালিত ডিবিতে আলাদা আলাদা নাম থাকতে পারে),
INFORMATION_SCHEMA.COLUMNS (কলাম_ডিফল্ট) ব্যবহার করুন:

IF NOT EXISTS(
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE (1=1) 
    AND TABLE_SCHEMA = 'dbo' 
    AND TABLE_NAME = 'T_VWS_PdfBibliothek' 
    AND COLUMN_NAME = 'PB_Text'
    AND COLUMN_DEFAULT IS NOT NULL  
)
BEGIN 
    EXECUTE('ALTER TABLE dbo.T_VWS_PdfBibliothek 
                ADD CONSTRAINT DF_T_VWS_PdfBibliothek_PB_Text DEFAULT (N''image'') FOR PB_Text; 
    '); 
END 

আপনি যদি কেবল বাধা-নাম দিয়ে পরীক্ষা করতে চান:

-- Alternative way: 
IF OBJECT_ID('DF_CONSTRAINT_NAME', 'D') IS NOT NULL 
BEGIN
    -- constraint exists, deal with it.
END 

এবং সর্বশেষে তবে সর্বনিম্ন নয়, আপনি কেবল
INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS নামে একটি ভিউ তৈরি করতে পারেন :

CREATE VIEW INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS 
AS 
SELECT 
     DB_NAME() AS CONSTRAINT_CATALOG 
    ,csch.name AS CONSTRAINT_SCHEMA
    ,dc.name AS CONSTRAINT_NAME 
    ,DB_NAME() AS TABLE_CATALOG 
    ,sch.name AS TABLE_SCHEMA 
    ,syst.name AS TABLE_NAME 
    ,sysc.name AS COLUMN_NAME 
    ,COLUMNPROPERTY(sysc.object_id, sysc.name, 'ordinal') AS ORDINAL_POSITION 
    ,dc.type_desc AS CONSTRAINT_TYPE 
    ,dc.definition AS COLUMN_DEFAULT 

    -- ,dc.create_date 
    -- ,dc.modify_date 
FROM sys.columns AS sysc -- 46918 / 3892 with inner joins + where 
-- FROM sys.all_columns AS sysc -- 55429 / 3892 with inner joins + where 

INNER JOIN sys.tables AS syst 
    ON syst.object_id = sysc.object_id 

INNER JOIN sys.schemas AS sch
    ON sch.schema_id = syst.schema_id 

INNER JOIN sys.default_constraints AS dc 
    ON sysc.default_object_id = dc.object_id

INNER JOIN sys.schemas AS csch
    ON csch.schema_id = dc.schema_id 

WHERE (1=1) 
AND dc.is_ms_shipped = 0 

/*
WHERE (1=1) 
AND sch.name = 'dbo'
AND syst.name = 'tablename'
AND sysc.name = 'columnname'
*/

0

আমি মনে করি না যে এটি INFORMATION_SCHEMA- এ রয়েছে - আপনাকে সম্ভবত সিসোবজেক্টস বা সম্পর্কিত অবহেলিত সারণী / দর্শনগুলি ব্যবহার করতে হবে।

আপনি ভাবেন যে INFORMATION_SCHEMA.TABLE_CONSTRAINTS এ এর ​​জন্য কোনও প্রকার থাকবে তবে আমি এটি দেখতে পাচ্ছি না।


0

সম্ভবত অন্য কিছু এসকিউএল ডিবিএমএস-এর জন্য "ডিফল্ট সীমাবদ্ধতা" আসলেই কোনও বাধা নয়, আপনি "INFORMATION_SCHEMA.TABLE_CONSTRAINTS" তে এর নামটি খুঁজে পাবেন না, তাই আপনার সেরা বেটটি "INFORMATION_SCHEMA.COLUMNS" হিসাবে অন্যরা ইতিমধ্যে উল্লেখ করেছে।

(এসকিউএল সার্ভার-ইগোরামাস এখানে)

এসকিউএল সার্ভার "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."কমান্ড সমর্থন না করে যদি আপনাকে "ডিফল্ট সীমাবদ্ধতা" এর নামটি জানতে হয় কেবল তখনই আমি এই কারণটি চিন্তা করতে পারি । তবে আপনি ইতিমধ্যে একটি অ-মানক অঞ্চলে রয়েছেন এবং আপনার যা প্রয়োজন তা পেতে আপনাকে পণ্য-নির্দিষ্ট উপায়গুলি ব্যবহার করতে হবে।


0

CHECK_CONSTRAINTS এবং CONSTRAINT_COLUMN_USAGE এর সংমিশ্রণটি কীভাবে ব্যবহার করবেন:

    select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name
          from information_schema.columns columns
             inner join information_schema.constraint_column_usage usage on 
                  columns.column_name = usage.column_name and columns.table_name = usage.table_name
             inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name
    where columns.column_default is not null

CONSTRAINT_COLUMN_USAGE ডিফল্ট সীমাবদ্ধতা সম্পর্কে কোনও তথ্য রাখে না।
স্টিফেন টার্নার

0

আমি সমস্ত ডিফল্ট (sp_binddefaults) এবং নিম্নলিখিত স্ক্রিপ্টগুলির সাথে সমস্ত ডিফল্ট সীমাবদ্ধতা পুনরুদ্ধার করতে ফলোলিং স্ক্রিপ্ট ব্যবহার করছি:

SELECT 
    t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName
FROM  
    sys.all_columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    JOIN sys.schemas s ON t.schema_id = s.schema_id
    LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
    LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name)
WHERE 
    SC.COLUMN_DEFAULT IS NOT NULL
    --WHERE t.name = '' and c.name = ''

0

অবজেক্ট ক্যাটালগ ভিউ : sys.default_constraints

তথ্য স্কিমা দর্শনগুলি INFORMATION_SCHEMAএএনএসআই-সম্মতিযুক্ত তবে ডিফল্ট সীমাবদ্ধতা আইএসও মানের একটি অংশ নয়। মাইক্রোসফ্ট এসকিউএল সার্ভার এসকিউএল সার্ভার অবজেক্ট মেটাডেটা সম্পর্কে তথ্য পাওয়ার জন্য সিস্টেম ক্যাটালগের ভিউ সরবরাহ করে।

sys.default_constraints সিস্টেম ক্যাটালগ ভিউ ডিফল্ট সীমাবদ্ধতা সম্পর্কে তথ্য পেতে অভ্যস্ত।

SELECT so.object_id TableName,
       ss.name AS TableSchema,
       cc.name AS Name,
       cc.object_id AS ObjectID,              
       sc.name AS ColumnName,
       cc.parent_column_id AS ColumnID,
       cc.definition AS Defination,
       CONVERT(BIT,
               CASE cc.is_system_named
                   WHEN 1
                   THEN 1
                   ELSE 0
               END) AS IsSystemNamed,
       cc.create_date AS CreationDate,
       cc.modify_date AS LastModifiednDate
FROM sys.default_constraints cc WITH (NOLOCK)
     INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id
     LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id
     LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id
                                               AND sc.object_id = cc.parent_object_id
ORDER BY so.name,
         cc.name;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.