کشف و مدیریت اشیاء پایگاه داده SQL Server با Sysobjects: راهنمای جامع پرسوجو
مدیریت اشیاء پایگاه داده، از جداول و ویوها گرفته تا روالها و توابع، یک جنبه حیاتی در اداره SQL Server است. جدول sysobjects
در SQL Server یک ابزار قدرتمند و تاریخی برای کسب اطلاعات دقیق در مورد این اشیاء فراهم میکند. این جدول، اگرچه در نسخههای جدیدتر SQL Server تا حد زیادی با نماهای کاتالوگ (Catalog Views) مدرنتر مانند sys.objects
جایگزین شده، اما همچنان برای بسیاری از توسعهدهندگان و مدیران پایگاه داده که با سیستمهای قدیمیتر کار میکنند، یا برای درک تاریخچه SQL Server، مرجع مهمی است.
با استفاده از sysobjects
، میتوانیم به سرعت لیستی از تمام اشیاء موجود در پایگاه داده فعلی را بازیابی کنیم. این پرسوجو نه تنها نام و نوع اشیاء را مشخص میکند، بلکه اطلاعات مربوط به تاریخ ایجاد و آخرین تغییر آنها را نیز ارائه میدهد، که برای ردیابی تغییرات و مدیریت چرخه عمر اشیاء پایگاه داده بسیار مفید است.
برای مشاهده تمام ستونهای موجود در جدول sysobjects
و درک کامل دادههایی که ارائه میدهد، میتوانیم از پرسوجوی زیر استفاده کنیم:
SELECT * FROM sysobjects;
در ادامه، به بررسی دقیقتر ستونهای کلیدی و نحوه استفاده از آنها برای استخراج اطلاعات خاص میپردازیم:
-
name: این ستون نام شیء پایگاه داده را ذخیره میکند. نامها معمولاً برای شناسایی جداول، ویوها، روالها، توابع و سایر اشیاء استفاده میشوند.
-
id: شناسه منحصر به فرد (ID) هر شیء را نشان میدهد که برای ارجاع داخلی توسط SQL Server به کار میرود.
-
xtype: نوع شیء را به صورت یک کد دو حرفی مشخص میکند. این کدها اطلاعات مهمی درباره ماهیت شیء (مثلاً جدول کاربر، ویو، روال ذخیره شده) ارائه میدهند. برای مثال، ‘U’ برای جداول کاربر و ‘P’ برای روالهای ذخیره شده است.
-
crdate: تاریخ و زمان ایجاد شیء را ثبت میکند. این تاریخ برای ردیابی زمان ایجاد هر شیء در پایگاه داده حیاتی است.
-
refdate: تاریخ آخرین ارجاع به شیء را ذخیره میکند (اگرچه در نسخههای جدیدتر کمتر مورد استفاده قرار میگیرد).
-
version: شماره نسخه داخلی شیء را نشان میدهد.
-
category: دسته بندی شیء را مشخص میکند.
-
status: وضعیت شیء را نشان میدهد که میتواند شامل ویژگیهای مختلفی مانند وضعیت اجرای موازی باشد.
-
uid: شناسه کاربری مالک شیء را نشان میدهد.
-
info: اطلاعات اضافی درباره شیء را نگهداری میکند.
-
delresrv: نشانگر رزرو حذف است.
-
sysstat: وضعیت سیستم شیء را نشان میدهد.
-
schemacfg: پیکربندی طرحواره (schema configuration) شیء را نشان میدهد.
-
schemaver: نسخه طرحواره شیء را نشان میدهد.
-
base_schema_ver: نسخه طرحواره پایه را نشان میدهد.
-
replinfo: اطلاعات مربوط به تکثیر (replication) را نگهداری میکند.
-
objmoddate: تاریخ و زمان آخرین تغییر در تعریف شیء را ذخیره میکند. این ستون برای مشاهده زمان آخرین بهروزرسانی یا اصلاح یک شیء بسیار مهم است و کمک میکند تا تغییرات اخیر در ساختار پایگاه داده را ردیابی کنیم.
در ادامه، به چند مثال کاربردی از نحوه پرسوجو از sysobjects
برای یافتن اطلاعات خاص درباره اشیاء پایگاه داده میپردازیم:
یافتن تمام جداول کاربری (User Tables):
برای فیلتر کردن و نمایش تنها جداولی که توسط کاربران ایجاد شدهاند، میتوانیم از xtype = 'U'
استفاده کنیم. این کد نشاندهنده “User Table” است و به ما امکان میدهد لیست جداول اصلی پایگاه داده را دریافت کنیم.
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE xtype = 'U'
ORDER BY name;
یافتن تمام ویوها (Views):
برای مشاهده ویوهای موجود در پایگاه داده، از xtype = 'V'
استفاده میکنیم. ‘V’ مخفف “View” است و این پرسوجو لیستی از تمام نماهای تعریف شده را برمیگرداند.
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE xtype = 'V'
ORDER BY name;
یافتن تمام روالهای ذخیره شده (Stored Procedures):
برای بازیابی روالهای ذخیره شده، از xtype = 'P'
استفاده میکنیم که نشاندهنده “Stored Procedure” است. این به مدیران پایگاه داده اجازه میدهد تا به سرعت روالهای موجود را شناسایی کنند.
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE xtype = 'P'
ORDER BY name;
یافتن تمام تریگرها (Triggers):
تریگرها با xtype = 'TR'
مشخص میشوند. این پرسوجو تمام تریگرهای تعریف شده بر روی جداول یا ویوها را نشان میدهد.
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE xtype = 'TR'
ORDER BY name;
یافتن تمام توابع (Functions):
توابع میتوانند انواع مختلفی داشته باشند؛ برای مثال، توابع اسکالر (Scalar Functions) با xtype = 'FN'
، توابع درون خطی جدولی (Inline Table-Valued Functions) با xtype = 'IF'
و توابع چند دستهای جدولی (Multi-Statement Table-Valued Functions) با xtype = 'TF'
مشخص میشوند. این پرسوجو تمام انواع توابع را فهرست میکند:
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE xtype IN ('FN', 'IF', 'TF')
ORDER BY name;
لیست کامل انواع اشیاء xtype
که میتوانید با sysobjects
فیلتر کنید، شامل موارد زیر است. هر کدام از این کدها به شناسایی دقیق نوع شیء در پایگاه داده کمک میکنند:
'U' - User Table
'V' - View
'P' - Stored Procedure
'TR' - Trigger
'FN' - Scalar Function
'IF' - Inline Table-Valued Function
'TF' - Multi-Statement Table-Valued Function
'RF' - Replication Filter Stored Procedure
'C' - CHECK Constraint
'D' - DEFAULT Constraint or Default Object
'F' - FOREIGN KEY Constraint
'PK' - PRIMARY KEY Constraint
'S' - System Table
'SN' - Synonym
'SQ' - Service Queue
'TT' - Table Type
'UD' - User-Defined Data Type
'UQ' - UNIQUE Constraint
'IT' - Internal Table (e.g., for Service Broker or XML)
'X' - Extended Stored Procedure
یافتن اشیاء ایجاد شده پس از یک تاریخ خاص:
برای ردیابی اشیایی که پس از یک تاریخ مشخص ایجاد شدهاند، میتوانیم از ستون crdate
استفاده کنیم. این برای بررسی تغییرات اخیر در پایگاه داده بسیار مفید است.
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE crdate > '2023-01-01'
ORDER BY crdate DESC;
یافتن اشیاء تغییر یافته پس از یک تاریخ خاص:
مشابه تاریخ ایجاد، میتوانیم اشیایی را که پس از یک تاریخ معین تغییر یافتهاند، با استفاده از ستون objmoddate
پیدا کنیم. این به ما کمک میکند تا فعالیتهای توسعه یا نگهداری اخیر را ردیابی کنیم.
SELECT name, crdate, objmoddate
FROM sysobjects
WHERE objmoddate > '2023-01-01'
ORDER BY objmoddate DESC;
یافتن اشیاء بر اساس مالک (User ID):
برای فیلتر کردن اشیاء بر اساس کاربری که آنها را ایجاد کرده است، از uid
استفاده میکنیم. این ستون شناسه کاربری (User ID) را ذخیره میکند که میتوان آن را با جدول sysusers
برای دریافت نام کاربر Join کرد.
SELECT o.name AS ObjectName, u.name AS OwnerName
FROM sysobjects o
JOIN sysusers u ON o.uid = u.uid
WHERE o.xtype = 'U' -- مثال: فقط جداول کاربری
ORDER BY u.name, o.name;
پیدا کردن وابستگیهای شیء:
برای یافتن وابستگیهای یک شیء خاص (مثلاً یک روال ذخیره شده)، میتوانیم sysobjects
را با syscomments
Join کنیم. این به ما کمک میکند تا بفهمیم کدام اشیاء به یک شیء دیگر ارجاع میدهند.
SELECT DISTINCT
o.name AS ObjectName,
o.xtype AS ObjectType,
c.text AS Definition
FROM sysobjects o
JOIN syscomments c ON o.id = c.id
WHERE c.text LIKE '%MyStoredProcedureName%' -- نام روال ذخیره شده مورد نظر را اینجا وارد کنید
ORDER BY ObjectName;
یافتن اشیاء سیستمی:
در نسخههای جدیدتر SQL Server، استفاده از sys.objects
ترجیح داده میشود، که دارای ستون is_ms_shipped
است. این ستون به وضوح مشخص میکند که آیا یک شیء توسط مایکروسافت ارسال شده (سیستمی) است یا توسط کاربر ایجاد شده است.
SELECT name, type_desc
FROM sys.objects
WHERE is_ms_shipped = 1
ORDER BY name;
استفاده از sys.objects و sys.schemas (رویکرد مدرن):
برای دریافت اطلاعات جامعتر و سازگارتر در نسخههای جدید SQL Server، استفاده از sys.objects
همراه با sys.schemas
توصیه میشود. sys.objects
جایگزین مدرن sysobjects
است و اطلاعات بیشتری با ساختار ستونی واضحتر ارائه میدهد. Join کردن آن با sys.schemas
امکان فیلتر کردن و نمایش اشیاء بر اساس طرحواره (schema) را فراهم میکند، که برای سازماندهی و مدیریت اشیاء پایگاه داده بسیار مهم است.
SELECT o.name AS ObjectName,
s.name AS SchemaName,
o.type_desc AS ObjectTypeDescription,
o.create_date AS CreationDate,
o.modify_date AS LastModificationDate
FROM sys.objects o
JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE o.is_ms_shipped = 0 -- فقط اشیاء کاربری
ORDER BY SchemaName, ObjectName;
این پرسوجو اطلاعات اشیاء کاربری را به همراه نام طرحواره، توضیحات نوع شیء، تاریخ ایجاد و تاریخ آخرین تغییر ارائه میدهد. استفاده از sys.objects
و sys.schemas
بهترین روش برای مدیریت اشیاء پایگاه داده در نسخههای جدید SQL Server است و جایگزین قدرتمندی برای sysobjects
محسوب میشود، در حالی که درک sysobjects
همچنان برای تحلیل سیستمهای قدیمیتر ضروری است.