۱۴۰۴/۰۶/۲۸ Nebular

اسکیما در 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) کار رو خیلی حرفه‌ای‌تر می‌کنه.

Accept Cookies
Accept Cookies
[your-shortcode]