اسکیما در SQL SERVER
اسکیما (Schema) در SQL Server چیست؟
اسکیما یه ظرف منطقی (Container) داخل دیتابیسه که آبجکتهای مختلف مثل جداول، Viewها، Stored Procedureها و Functionها رو گروهبندی میکنه. هر آبجکت تو دیتابیس حتماً باید تو یه اسکیما باشه، چون SQL Server بدون اسکیما اجازه ساخت آبجکت نمیده، و اسم کاملش بهصورت schema_name.object_name نوشته میشه (مثل dbo.Employees).
اسکیما چه فرقی با دیتابیس و یوزر داره؟
- دیتابیس: کل ساختار پایگاه داده که شامل همه اسکیماها و آبجکتهاست.
- اسکیما: یه گروهبندی منطقی از آبجکتها داخل دیتابیس.
- یوزر: حسابی که به اسکیما یا آبجکتها دسترسی داره. مالکیت اسکیما میتونه به یه یوزر یا نقش (Role) داده بشه.
اشتباه رایج: قبل از SQL Server 2005، هر یوزر یه اسکیمای پیشفرض با همون نام داشت (مثل User1.Table1). حالا اسکیما و یوزر کاملاً جدا هستن و اسکیما فقط برای گروهبندی آبجکتهاست.
اسکیماهای پیشفرض در SQL Server
- dbo: اسکیمای پیشفرض. اگه اسکیما مشخص نکنی، آبجکتها تو dbo ساخته میشن.
- sys و INFORMATION_SCHEMA: اسکیماهای سیستمی برای دسترسی به Metadata دیتابیس (مثل اطلاعات جداول یا ستونها). نباید تو این اسکیماها آبجکت جدید ساخت یا تغییرشون داد.
- guest: برای دسترسی کاربران مهمان (Guest Users).
مثال دسترسی:
SELECT * FROM dbo.Employees; -- جدول Employees در اسکیما dbo
SELECT * FROM HR.Employees; -- جدول Employees در اسکیما HR
مثالهای کاربردی
۱. ساخت اسکیما
CREATE SCHEMA HR;
این دستور یه اسکیمای جدید به اسم HR میسازه.
۲. ساخت جدول در اسکیما
CREATE TABLE HR.Employees (
EmpID INT PRIMARY KEY,
FirstName NVARCHAR(50),
LastName NVARCHAR(50)
);
جدول Employees حالا تو اسکیما HR قرار داره.
۳. دادن دسترسی به اسکیما
GRANT SELECT, INSERT ON SCHEMA::HR TO User1;
کاربر User1 حالا میتونه روی همه جداول اسکیما HR عملیات SELECT و INSERT انجام بده.
۴. انتقال آبجکت بین اسکیماها
ALTER SCHEMA Sales TRANSFER dbo.Orders;
جدول Orders از اسکیما dbo به اسکیما Sales منتقل میشه.
۵. مشاهده همه اسکیماها
SELECT name, schema_id, principal_id
FROM sys.schemas;
این کوئری لیست همه اسکیماهای دیتابیس رو نشون میده.
چرا از اسکیما استفاده کنیم؟
| مزیت | توضیح |
|---|---|
| سازماندهی بهتر | آبجکتها رو بر اساس کاربرد گروهبندی میکنه (مثل HR برای منابع انسانی، Sales برای فروش). |
| مدیریت امنیتی سادهتر | بهجای دسترسی دادن به تکتک جداول، میتونی روی کل اسکیما دسترسی بدی. |
| جلوگیری از تداخل نام | دو جدول همنام میتونن تو اسکیماهای مختلف باشن (مثل HR.Employees و Sales.Employees). |
| انعطافپذیری | انتقال آبجکتها بین اسکیماها یا مدیریت مالکیت سادهتره. |
نکات حرفهای
- همیشه اسکیما مشخص کن: موقع ساخت یا دسترسی به آبجکتها، اسم اسکیما رو بنویس (مثل dbo.Employees) تا از ابهام جلوگیری بشه.
- مالکیت اسکیما: مالک (Owner) اسکیما رو با ALTER AUTHORIZATION ON SCHEMA::HR TO User1; میتونی تغییر بدی.
- امنیت: بهجای دسترسی مستقیم به جداول، از اسکیماها برای مدیریت دسترسیهای گروهی استفاده کن.
- تمیز نگهداشتن dbo: تا حد ممکن آبجکتهای سفارشی رو تو اسکیماهای جداگونه بساز، نه تو dbo.
- بررسی وجود اسکیما: قبل از ساخت اسکیما، با IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = ‘HR’) وجودش رو چک کن.
- Default Schema برای یوزرها: هر یوزر تو SQL Server میتونه یه Default Schema داشته باشه که اگه اسکیما مشخص نکنه، آبجکتها تو اون ساخته میشن
جمعبندی
اسکیما یه ابزار قدرتمند برای سازماندهی و مدیریت آبجکتهای دیتابیسه. با اسکیما میتونی جداول و سایر آبجکتها رو گروهبندی کنی، امنیت رو بهتر مدیریت کنی و از تداخل نامها جلوگیری کنی. اسکیمای پیشفرض dbo خوبه، ولی برای پروژههای بزرگ، ساخت اسکیماهای سفارشی (مثل HR یا Sales) کار رو خیلی حرفهایتر میکنه.