دستورات DDL و CONSTRAINT ها

در این فصل دستورات از نوع DDL(DATA DEFINITION LANGUAGE) معرفی می شوند. مفهوم OBJECT و برخی از نوع داده هایی که در دیتابیس اوراکل استفاده می شوند را توضیح می دهیم. همچنین انواع CONSTRAINTها توضیح داده می شوند و خطاهایی که با رعایت نکردن آنها رخ می دهند را معرفی می کنیم.

انواع OBJECT ها در دیتابیس اوراکل

یک دیتابیس مجموعه ای از OBJECT های متفاوت است که متعلق به کاربران دیتابیس هستند. در جدول زیر بعضی از انواع OBJECT های دیتابیس اوراکل و توضیحات آنها را می بینید.

نکته: در دیتابیس اوراکل OBJECT ها به دو دسته تقسیم می شوند:

1.SCHEMA OBJECTS که تعدادی از آنها را در جدول بالا می بینید.

2.NON-SCHEMA OBJECTS مانند دایرکتوری، TABLESPACE و ROLE.

 

نام گذاری OBJECT ها

باید در نام گذاری OBJECT های دیتابیس اوراکل قوانین زیر رعایت شوند:

1.نام OBJECT باید با حروف انگلیسی آغاز شود.

2.یک نام می تواند بین 1 تا 30 کارکتر باشد.

3.در نام گذاری فقط می توان از کارکترهای A تا Z، a تا z، 0 تا 9، _ ، $ و # استفاده نمود.

4.نام یک  OBJECT باید با نام OBJECT های دیگر که مالک آنها یکسان است متفاوت باشد.

5.از نام های رزرو شده توسط دیتابیس اوراکل نمی شود استفاده کرد(مثلا TABLE).

 

نکته: نام یک OBJECT به بزرگی یا کوچکی حروف حساس نیست. البته زمانی که در برخی دستورات به نام OBJECT ها اشاره می شود(از علامت ” ” استفاده می شود) باید بزرگی و یا کوچکی حروف رعایت شود.

 

نوع داده ها در دیتابیس اوراکل

برای هر ستون از یک جدول باید یک نوع داده مشخص کنیم. در دیتابیس اوراکل نوع داده ها به دو حالت Fixed-Length یا  Variable-Length هستند. اگر یک ستون با نوع داده های Variable-Length تعریف شود هر سطر از آن ستون می تواند دارای طول متفاوت باشد. یعنی فضایی که هر سطر از دیتابیس اشغال می کند برابر با اندازه مقدار آن سطر می باشد. ولی در نوع داده های Fixed-Length طول تمام سطرها یکسان است. در ادامه برخی از نوع داده های پرکاربرد در دیتابیس اوراکل توضیح داده می شوند.

(VARCHAR2(size: این نوع داده Variable-Length است و اگر در دیتابیس پارامتر MAX_SQL_STRING برابر با EXTENDED باشد طول پیش فرض آن می تواند بین 1 تا 32767 بایت تعریف گردد(توسط size). در اوراکل 12c اگر پارامتر MAX_SQL_STRING برابر با LEGACY باشد  طول پیش فرض می تواند بین 1 تا 4000 بایت تعریف شود.

[(CHAR[(size: این نوع داده Fixed-Length است و به صورت اختیاری می توان طول آن را تعریف کرد. اگر طول آن تعریف نشود طول هر سطر 1 بایت خواهد بود. ولی size را می توان 1 تا 2000 بایت تعریف نمود.

(NUMBER(p,s: این نوع داده Variable-Length است.در آن p تعداد اعداد دسیمال است و این تعداد می تواند بین 1 تا 38 تعریف شود. همچنین s تعداد اعداد اعشاری است که می تواند بین 84- تا 127 تعریف شود.

DATE: نوع داده DATE به منظور ذخیره سازی زمان و تاریخ تعریف می شود.

LONG: این نوع داده Variable-Length است که طول آن در هر سطر می تواند تا حداکثر 2 گیگابایت باشد. معمولا از نوع داده LONG استفاده نمی شود و بجای آن از CLOB استفاده می گردد.

CLOB: این نوع داده یک CHARACTER LARGE OBJECT است که Variable-Length می باشد و می تواند کاراکترهای از نوع Single-Byte یا Multiple-Byte ذخیره کند. حداکثر طول هر سطر می تواند (4gigabyte -1) * DB_BLOCK_SIZE باشد. از این نوع داده معمولا برای ذخیره صدا، تصویر یا ویدئو  استفاده می شود.

NCLOB: همان CLOB است ولی اگر کاراکترست دیتابیس از نوع Multibye نباشد نیز کاراکترهایی که با فرمت Multibyte هستند را نمایش می دهد (مثلا زبان چینی).

(RAW(size: این نوع داده Variable-Length است و برای ذخیره ی داده های از نوع باینری یا رشته ای از کاراکترها استفاده می شود. اگر پارامتر دیتابیس MAX_SQL_STRING برابر با EXTENDED باشد طول پیش فرض آن می تواند بین 1 تا 32767 بایت تعریف گردد(توسط size). اگر پارامتر MAX_SQL_STRING برابر با LEGACY باشد  طول پیش فرض می تواند بین 1 تا 4000 بایت تعریف شود. از RAW برای ذخیره فایل های خواندنی و گرافیکی استفاده می شود.

LONG RAW: همانند RAW است ولی طول آن در هر سطر می تواند تا 2 گیگابایت باشد.

BLOB: این BINARY LARGE OBJECT همانند CLOB است ولی ذخیره اطلاعات به صورت باینری می باشد.

BFILE: یک LARGE OBJECT است که برای ذخیره اطلاعات باینری در یک فایل خارج از دیتابیس استفاده می شود و طول آن 4 گیگابایت می باشد.

ROWID: در این نوع داده یک رشته بر مبنای 64 ذخیره می شود که آدرس هر سطر از یک جدول را مشخص می کند.

 

نکته: به دلیل محدودیت های زیر بهتر است از نوع داده CLOB بجای نوع داده LONG استفاده نمود.

1.اگر با استفاده از روش SUBQUERY یک جدول را کُپی کنیم ستون هایی که نوع داده آنها LONG هستند کُپی نمی شوند.

2.یک ستون از نوع داده LONG را نمی توان در عبارت های GROUP BY و ORDER BY استفاده نمود.

3.در هر جدول فقط می توانیم یک ستون با نوع داده LONG تعریف کنیم.

4.اگر یک ستون از نوع LONG باشد هیچ CONSTRAINT برای آن ستون نمی توان تعریف کرد.

 

نوع داده برای زمان و تاریخ

برای مقدارهای تاریخ و زمان علاوه بر نوع داده DATE می توان از نوع داده های جدول زیر استفاده نمود.

نکته: کاربرد اصلی نوع داده های INTERVAL زمانی است که اختلاف دو تاریخ را می خواهیم محاسبه کنیم.

مثال: یک جدول اطلاعات افراد بسازید و تجربه کاری کارمند Camila را 10 سال و 2ماه ذخیره کنید.

CREATE TABLE candidates (

    candidate_id NUMBER,

    first_name VARCHAR2(50) NOT NULL,

    last_name VARCHAR2(50) NOT NULL,

    job_title VARCHAR2(255) NOT NULL,

    year_of_experience INTERVAL YEAR TO MONTH,

    PRIMARY KEY (candidate_id)

);

INSERT INTO candidates (

    first_name,

    last_name,

    job_title,

    year_of_experience

    )

VALUES (

    ‘Camila’,

    ‘Kramer’,

    ‘SCM Manager’,

    INTERVAL ’10-2′ YEAR TO MONTH

    );

نکته: می توان مقدار LITERAL برای نوع داده های INTERVAL تعریف نمود.

مثال: یک بازه زمانی 10 سال و 0 ماه تعریف کنید تا در یک دستور خاص استفاده شود.

INTERVAL ’15’ YEAR

مثال: یک بازه زمانی 8 ساعته تعریف کنید تا در یک دستور خاص استفاده شود.

INTERVAL ‘8’ HOUR

 

تعریف مقدار پیش فرض برای یک نوع داده

اگر در زمان تعریف نوع داده برای یک ستون از کلمه DEFAULT استفاده شود می توان نوع داده پیش فرض آن را تعیین کرد. این نوع داده پیش فرض می تواند یک LITERAL، عبارت یا تابع SQL باشد. بنابراین زمانی که می خواهیم یک سطر را که برای یک ستون خاص هیچ مقداری ندارد به جدول اضافه کنیم اگر برای نوع داده آن ستون خاص از عبارت DEFAULT استفاده شده باشد در آن سطر مقدار DEFAULT درج خواهد شد.

مثال: اگر در دستور INSERT مقداری برای ستون HIRE_DATE درج نشد مقدار SYSDATE(تاریخ و زمان فعلی سیستم) در آن سطر درج شود.

نکته: بنابراین در جدول بالا فقط زمانی که مقدار NULL در دستور آورده شود در ستون HIRE_DATE یک مقدار NULL درج می شود.

دستور CREATE TABLE

اگر مجوز لازم را داشته باشیم می توانیم با دستور CREATE TABLE یک جدول بسازیم. این دستور از نوع DDL است بنابراین بعد از اجرای آن یک عمل COMMIT به صورت اتوماتیک انجام می شود. سینتکس این دستور را در شکل زیر می بینید. در این سینتکس [schema.] نام کاربری است که مالک جدول است و زمانی که با آن کاربر متصل هستیم استفاده از آن اختیاری است. همچنین نام ستون ها و نوع داده آنها در داخل پرانتز تعریف می شوند.

نکته: بعد از ساختن یک جدول با دستور CREATE TABLE اطلاعات این جدول در دیتادیکشنری دیتابیس اوراکل ثبت می شود و می توان  با دستور زیر این اطلاعات را نمایش داد.

مثال: برای کاربر NADER یک جدول به اسم EMPLOYEE2 با شش ستون بسازید.

CREATE TABLE NADER.Employee2  

(  

EmployeeID int,  

FirstName varchar(255),  

LastName varchar(255),  

Email varchar(255),  

AddressLine varchar(255),  

City varchar(255)  

);  

مثال: یک جدول به نام DEPT بسازید و نوع داده ستون CREATE_DATE به صورت DEFAULT برابر با تاریخ سیستم شود. سپس با استفاده از دستور DESC(در SQL*PLUS) مشخصات جدول را نمایش دهید.

 

انواع CONSTRAINT ها

زمانی که برای مجموعه ای از داده ها یک CONSRAINT تعریف می شود باید قوانین خاصی در زمان بروزرسانی، درج یا حذف آن داده ها رعایت شوند. در واقع CONSTRAINT ها یکسری محدودیت و شرایط خاص تعیین می کنند که در دستورات DML و DDL در نظر گرفته می شوند. می توان یک CONSTRAINT تعریف کرد که اگر اطلاعات یک جدول به یک جدول اصلی وابسته بود از حذف شدن جدول اصلی جلوگیری کند. بکارگیری CONSTRAINT در جدول ها سبب یکپارچگی در سطح دیتابیس می شود. انواع CONSTRAINT ها و توضیحات آنها را در جدول زیر می بینید.

 

نکاتی در مورد CONSTRAINT ها

–اگر برای یک CONSTRAINT هیچ نامی انتخاب نشود سرور اوراکل از قالب SYS_Cn برای نام گذاری آن CONSTRAINT استفاده می کند و یک نام اتوماتیک ایجاد می کند.

–می توان در زمان ایجاد یک جدول با دستور CREATE TABLE همزمان CONSTRAINT های مورد نیاز راتعریف نمود. همچنین می توانیم بعد از ساخته شدن یک جدول، CONSTRAINT های آن را تعریف کنیم.

–بعد از تعریف CONSTRAINT اطلاعات مربوط به آنها در دیتادیکشنری دیتابیس ذخیره می شوند.

–CONSTRAINT یک OBJECT از دیتابیس اوراکل است بنابراین در تعیین نام آنها باید قوانین نام گذاری OBJECT ها را رعایت کنیم.

 

CONSTRAINT در سطح ستون و در سطح جدول

می توان CONSTRAINT ها را در دوسطح مختلف ستون و یا جدول تعریف کرد که از نظر عملکرد هیچ تفاوتی با هم ندارد. ولی اگر در سطح جدول تعریف می شوند باید ستون یا ستون های مورد نظر برای آن CONSTRAINT تعیین شوند.

سینتکس مربوط به تعریف CONSTRAINT در سطح ستون را در شکل زیر می بینید.

سینتکس مربوط به تعریف CONSTRAINT در سطح جدول را در شکل زیر می بینید. ابتدا تمام ستون ها تعریف می شوند سپس CONSTRAINTها تعریف می شوند.

مثال: یک CONSTRAINT به نام emp_emp_id_pk در سطح ستون تعریف کنید.

 

مثال: CONSTRAINT مثال قبلی را در سطح جدول تعریف کنید.

نکته: اگر یک CONSTRAINT به صورت ترکیبی باشد و برای بیشتر از یک ستون تعریف شود فقط می توان آن را در سطح جدول تعریف نمود.

نکته: CONSTRAINT های از نوع NOT NULL را فقط در سطح ستون می توان تعریف کرد.

 

NOT NULL COSTRAINT

زمانی که برای یک ستون از جدول خاص یک CONSTRAINT از نوع NOT NULL تعریف می شود، اگر توسط دستورات DML مقدار NULL برای آن ستون در نظر گرفته شود خطای اوراکل دریافت می کنیم. بنابراین هیچ مقدار NULL در آن ستون قرار نخواهد گرفت.

مثال: در جدول زیر ستون های EMPLOYEE_ID، LAST_NAME،  SALARY و HIRE_DATE از نوع NOT NULL تعریف شده اند بنابراین هیچ مقدار NULL در سطرهای جدول برای این ستون ها وجود ندارد. از طرفی ستون های دیگر مانند COMISSION_PCT بدون CONSTRAINT از نوع NOT NULL هستند بنابراین مقدار NULL ذخیره می کنند.

 

UNIQUE CONSTRAINT

زمانی که از این نوع  CONSTRAINT برای یک ستون استفاده می شود تمام سطرهای جدول که برای آن ستون دارای مقدار غیر NULL هستند به صورت غیر تکراری و متفاوت از همدیگر خواهند بود ولی می توان هر تعداد از مقدار NULL برای آن ستون داشته باشیم(البته مطابق تعریف مقدار NULL این مقدارها با هم متفاوت هستند). همچنین می توان همزمان برای یک ستون از دو CONSTRAINT از نوع UNIQUE و  NOT NULL استفاده نمود. بنابراین فقط زمانی دستورات DML برای یک ستون از نوع UNIQUE اجرا می شوند که مقدار جدید آن قبلا در جدول وجود نداشته باشد.

نکته: یک CONSTRAINT از نوع UNIQUE را می توان در سطح ستون یا جدول تعریف کرد.

مثال: یک CONSTRAINT از نوع UNIQUE در سطح جدول تعریف کنید.

نکته: زمانی که یک ستون به عنوان UNIQUE تعریف می شود سرور اوراکل به صورت اتوماتیک یک INDEX برای آن ستون می سازد.

نکته: می توان برای مجموعه ای از ستون های یک جدول به صورت ترکیبی یک CONSTRAINT از نوع UNIQUE تعریف کرد.

 

PRIMARY KEY CONSTRAINT

تعریف و کارکرد یک CONSTRAINT از نوع PRIMARY KEY همانند UNIQUE است ولی در دو مورد با هم متفاوت هستند:

1.در یک ستون از نوع PRIMARY KEY نمی توان مقدار NULL ذخیره کرد. در واقع به صورت اتوماتیک یک CONSTRAINT از نوع NOT NULL در نظرگرفته می شود.

2.در هر جدول فقط یک PRIMARY KEY می توان تعریف کرد.

نکته: یک CONSTRAINT از نوع PRIMARY KEY را می توان به صورت ترکیبی از ستون ها تعریف کرد.

نکته: برای هر ستون از نوع PRIMARY KEY به صورت اتوماتیک توسط سرور توراکل یک INDEX ساخته می شود.

 

FOREIGN KEY CONSTRAINT

در این CONSTRAINT  ستونی از یک جدول برای مثال جدول B را به عنوان FOREIGN KEY تعریف می کنیم و آن ستون را به ستونی از جدول A که از نوع UNIQUE یا PRIMARY KEY است ارتباط (RELATION) می دهیم. این ارتباط باعت می شود ستون FOREIGN KEY درجدول B فقط مقدارهایی که قبلا در ستون مرتبط جدول A درج شده است را بپذیرد و درج کند. جدول B جدول CHILD نام دارد و به جدول A، PARENT می گویند. جدول PARENT و ستون مرتبط آن در زمان تعریف FOREIGN KEY و به وسیله عبارت REFRENCES مشخص می شوند. بنابراین هر مقداری که در ستون FOREIGN KEY درج می شود یا باید NULL باشد یا برابر با یکی از مقدارهای درج شده در ستون جدول مرتبط باشد.

نکته: با توجه به تعاریف بالا مقدارهای ستون FOREGN KEY مطابق مقدارهای ستون PARENT می باشند و یک اشاره گر به محل فیزیکی دیتا در جدول PARENT نیستند.

نکته: می توان FOREIGN KEY را در سطح ستون یا در سطر جدول تعریف کرد(همانند CONSTRAINT های قبلی اگر به صورت ترکیبی برای چند ستون تعریف شود باید آن را در سطح جدول تعریف کرد).

مثال: برای شکل بالا یک FOREIGN KEY در سطح جدول تعریف کنید(جدول EMPLYEES جدول CHILD و جدول DEPARTMENTS جدول PARENT است و ستون DEPARTMENT_ID در جدول CHILD به ستون DEPARTMENT_ID در جدول PARENT مرتبط است).

نکته: اگر FOREGN KEY در سطح ستون تعریف شود نیاز نیست از عبارت FOREIGN KEY استفاده شود.

مثال: برای مثال قبلی FOREGN KEY را در سطح ستون تعریف کنید.

نکته: اگر در زمان تعریف یک FOREIGN KEY از عبارت ON DELETE CASCADE استفاده شود می توان سطری از جدول PARENT که به جدول CHILD وابسته است را پاک کرد و در این حالت سطرهای وابسته از جدول CHILD نیز  به صورت اتوماتیک پاک خواهند شد.

نکته: اگر در زمان تعریف یک FOREIGN KEY از عبارت ON DELETE SET NULL استفاده شود می توان سطری از جدول PARENT که به جدول CHILD وابسته است را پاک کرد و در این حالت ستون های مرتبط از سطرهای وابسته در جدول CHILD به صورت اتوماتیک مقدار NULL می گیرند.

نکته: در دیتابیس اوراکل به صورت پیش فرض از اجرای دستور DELETE و UPDATE بر داده هایی که جدول های دیگر به آنها وابستگی دارند جلوگیری می شود مگر آنکه ON DELETE CASCADE یا SET NULL باشند .

 

CHECK CONSTRAINT

زمانی که از CONSTRAINT نوع CHECK استفاده شود برای جدول یک شرط تعریف می کنیم که هر تغییری در جدول فقط با داشتن آن شرط امکان پذیر خواهد بود.

نکته: در شرط CHECK نمی توان از تابع SYSDATE استفاده کرد. همچنین نمی توان از دستوری که یک مقدار را در سطرهای دیگر جدول بررسی می کند استفاده کرد.

مثال: در سطح جدول یک CONSTRAINT از نوع CHECK تعریف کنید که هر عمل DML فقط در صورتی اجرا شود که مقدار حقوق آن سطر بیشتر از 0 باشد.

نکته: می توان برای هر ستون چنیدین CHECK CONSTRAINT تعریف نمود.

مثال: CONSTRAINT مثال بالا را در سطح ستون SALARY تعریف کنید.

مثال: ساختن یک جدول به همرا تعریف CONSTRAINT های آن.

مثال هایی از رعایت نکردن CONSTRAINT ها

در این مثال ها جدول EMPLYEES جدول CHILD و جدول DEPARTMENTS جدول PARENT است و ستون DEPARTMENT_ID در جدول CHILD به ستون DEPARTMENT_ID در جدول PARENT مرتبط است.

مثال 1: می خواهیم در جدول EMPLOYEES مقدار ستون DEPARTMENT_ID را در سطری که برابر با 110 است به 55 تغییر دهیم. از آنجایی که این ستون به جدول PARENT و ستون DEPARTMENT_ID وابسته است و در آن جدول هیچ مقدار 55 در ستون DEPARTMENT_ID وجود ندارد بنابراین این دستور اجرا نمی شود و خطای اوراکل دریافت می کنیم.

مثال 2: می خواهیم سطری از جدول DEPARTMENT که در آن مقدار ستون DEPARTMENT_ID برابر با 60 است را پاک کنیم. ولی این دستور اجرا نمی شود و خطای اوراکل دریافت می کنیم زیرا در جدول CHILD از این مقدار استفاده شده است.

مثال 3: در مثال قبلی در جدول DEPARTMENTS سطر دارای مقدار 60 را می توانیم پاک کنیم زیرا هیچ سطری از جدول CHILD از این مقدار استفاده نکرده است.

 

ساختن جدول با استفاده از SUBQUERY

با استفاده از دستور CREATE TABLE و روش SUBQUERY می توان بطور همزمان یک جدول ساخت و مقدارهای جدول دیگر را در داخل آن درج کرد. البته به شرطی که تعداد ستون ها در دستور CREATE و SUBQUERY  یکسان باشد.

مثال: جدول DEPT80 را همزمان با درج کردن برخی سطرها و ستون های جدول EMPLOYEES در آن بسازید( فقط سطرهایی که مقدار DEPARTMENT_ID برابر با 80 است در جدول جدید درج شوند.).

نکته: زمانی که از روش SUBQUERY برای ساخت جدول استفاده می شود به غیر از CONSTRAINT از نوع NULL هیچ CONSTRAINT دیگری از جدول قبلی به جدول جدید منتقل نمی شود. البته اگر CONSTRAINT از نوع NULL به صورت صریح تعریف شده باشد یعنی اگر یک ستون از نوع PRIMARY KEY باشد CONSTRAINT از نوع NULL به جدول جدید منتقل نمی شود.

مثال: در مثال قبل دو ستون از جدول جدید با CONSTRAINT از نوع NULL ساخته شده اند زیرا در جدول قبلی به صورت صریح تعریف شده اند.

 

نکته: اگر در روش ساخت جدول با SUBQUERY یکی از ستون ها به صورت یک عبارت محاسبه ای بود(SALARY*12 در مثال قبل) باید از یک نام مستعار  استفاده کرد(ANNSAL در مثال قبل) وگرنه خطای اوراکل دریافت می کنیم.

مثال: در دستور مثال قبل از نام مستعار استفاده نشده است. بنابراین خطای اوراکل دریافت می کنیم.

 

دستور ALTER TABLE

دستور ALTER TABLE از نوع DDL است بنابراین بعد از اجرای آن به صورت اتوماتیک توسط دیتابیس یک عمل COMMIT انجام می شود. با استفاده از این دستور می توان عملیات زیر را برای یک جدول انجام داد:

–تغییر نام ستون های یک جدول.

–اضافه کردن یک یا چند ستون به جدول.

–تغییر نام ستون ها.

–تغییر سایز یا نوع داده ستون ها.

نکته: فقط اگر یکی از حالت های زیر برقرار باشد می توان سایز یک ستون را با دستور ALTER TABLE کاهش دهیم:

–جدول هیچ سطری نداشته باشد.

–آن ستون از جدول فقط مقدار NULL داشته باشد.

–کاهش سایز کمتر از سایز تمامی مقدارهای آن جدول برای آن ستون باشد.

نکته: فقط زمانی که تمام مقدارهای یک ستون NULL باشد می توان با دستور ALTER TABLE نوع داده آن ستون را عوض کرد. البته برای تبدیل نوع داده CHAR به VARCHAR2 نیازی به NULL بودن مقدارهای آن ستون نیست.

 

عبارت DROP در دستور ALTER TABLE

می توان با استفاده از عبارت DROP COLOUMN در دستور ALTER TABLE ستون های یک جدول را حذف نمود.

مثال: ستون JOB_ID از جدول DEPT80 را حذف کنید

نکته: در هر دستور ALTER TABLE فقط می توان یک ستون را با استفاده از عبارت DROP حذف کرد البته هر جدول باید حداقل یک ستون داشته باشد و آن را نمی شود DROP کرد.

نکته: اگر یک ستون دارای CONSTRAINT از نوع PRIMARY KEY باشد و اطلاعات جدول دیگر به آن ستون وابسته باشد(رابطه CHID و PARENT) نمی توان آن ستون را حذف کرد مگر اینکه CONSTRANT از نوع FOREIGN KEY به روش SET NULL یا CASCADE تعریف شده باشد.

 

عبارت SET UNUSED در دستور ALTER TABLE

زمانی که یک دستور ALTER TABLE با عبارت DROP برای حذف کردن یک ستون استفاده می شود اگر سایز آن ستون زیاد باشد منابع سرور مشغول می شوند و ممکن است سبب کندی سیستم شود. بنابراین می توان با استفاده از عبارتSET UNUSED یک ستون را به عنوان ستون حذف شده تعیین کرد و آن را غیر فعال کنیم تا در زمان مناسب DROP شود و فضای ذخیره ساز آزاد گردد. زمانی که یک ستون را SET UNUSED می کنیم دقیقا مانند زمانی است که آن ستون را حذف می کنیم با این تفاوت که تا قبل از استفاده از یک دستور با عبارت DROP همچنان فضای دیسک را اشغال کرده است. در شکل زیر سینتکس این عبارت را به همراه یک مثال می بینید.

مثال: ستون LAST_NAME را UNUSED کنید و سپس آن ستون را در زمان غیر اداری و کم مشتری از دیتابیس حذف کنید تا فضای آن آزاد شود.

نکته: اگر در یک دستور از کلمه ONLINE استفاده شود به این معنی می باشد که در زمان اجرای آن دستور هرگونه عملیات از نوع DML در جدول به صورت همزمان می تواند اجرا شود و نیاز نیست جدول LOCK شود و دستورات DML منتظر این دستور بمانند. البته وقتی از عبارت ONLINE استفاده می شود یک زمان کوتاه در ابتدا و انتهای دستور عمل LOCK انجام می شود.

مثال: در زمان UNUSED کردن ستون HIRE_DATE عملیات DML انجام شود.

 

عبارت READ ONLY در دستور ALTER TABLE

می توانیم با استفاده از عبارت READ ONLY در دستور ALTER TABLE یک جدول را در حالت فقط خواندنی قرار دهیم. هیچ کدام از دستورات DML و DDL برای جدولی که در حالت فقط خواندنی است اجرا نخواهد شد. بنابراین نمی توان اطلاعات آن جدول را تغییر داد.

مثال: جدول EMPLOYEES را READ ONLY کنید و سپس به حالت اول (READ WRITE) برگردانید.

نکته: می توان جدولی که در حالت READ ONLY قرار دارد را با دستور DROP TABLE به صورت کامل حذف کرد.

 

دستور DROP TABLE

دستور DROP TABLE یک دستور از نوع DDL است و برای حذف کردن یک جدول استفاده می شود. زمانی که این دستور برای یک جدول استفاده می شود موارد زیر اتفاق می افتند:

–جدول به RECYCLE BIN یا سطل آشغال دیتابیس منتقل می شود ولی فضای دیسک آن آزاد نمی شود مگر اینکه از عبارت PURGE در دستور DROP TABLE استفاده شود.

–تمام INDEX های مربوط به آن جدول حذف می شوند.

–VIEW ها و SYNONYM های مربوط به آن جدول حذف نمی شوند ولی INVALID می شوند.

–تراکنش های در لیست انتظار مربوط به این جدول COMMIT می شوند.

نکته: دستور DROP TABLE فقط توسط کاربری که مالک آن جدول است یا مجوز DROP ANY TABLE دارد می تواند اجرا شود.

مثال: جدول DEPT80 را حذف کنید.

 

Comment (1)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *