آموزش SQL Server مدیریت مستندات
فایلهای آماده
فایل SQL شامل ساخت دیتابیس، جداول، روابط، ایندکسها، RLS، Procedureها، Viewها، دادههای تمرینی و گزارشهای مشاهده و دانلود است.
هشدار: اسکریپت آزمایشگاهی، دیتابیس CorporateDMS_Lab را در صورت وجود حذف و دوباره ایجاد میکند. روی محیط عملیاتی اجرا نشود.
تحلیل اولیه مسئله
در یک سامانه مستندات حساس، فقط نگهداری نام و مسیر فایل کافی نیست. سامانه باید ثابت کند چه کسی، با چه سطح دسترسی، در چه نشست و از چه IP یا دستگاهی، کدام نسخه را مشاهده، دانلود، چاپ یا به اشتراک گذاشته است.

داراییها
فایل و نسخههای آن، متادیتا، مجوزها، گردش تأیید، سوابق دسترسی، کلیدهای رمزگذاری و Backup.
تهدیدها
دسترسی بیشازحد، سرقت فایل، اتصال مستقیم به DB، حذف یا تغییر لاگ، بدافزار و اشتراکگذاری ناخواسته.
اصول
کمترین دسترسی، تفکیک وظایف، MFA، مجوز موقت، Deny مقدم بر Allow و ثبت همه عملیات حساس.
تصمیم ذخیرهسازی
متادیتا در SQL Server و فایل در Object Storage، FILESTREAM یا NAS رمزگذاریشده قرار میگیرد.
چرا فایل در جدول عادی VARBINARY(MAX) نیست؟ در مقیاس بالا، استریم فایل، آنتیویروس، چرخه عمر، نسخه پشتیبان و لینک تحویل کوتاهعمر در فضای ذخیرهسازی تخصصی بهتر مدیریت میشود. دیتابیس مسیر، هش و مجوز را کنترل میکند.
سناریوی پیشنهادی
شرکت فرضی شامل مدیریت ارشد، مالی، منابع انسانی، فناوری اطلاعات، حقوقی، فروش و حسابرسی داخلی است. فایلها از راهنمای عمومی برند تا پرونده بهکلی سری ادغام و تملک طبقهبندی میشوند.
- مالک سند، عنوان، دسته، واحد، سطح امنیت و سیاست نگهداری را ثبت میکند.
- فایل در فضای امن قرار میگیرد و هش SHA-256 نسخه ثبت میشود.
- کاربر پس از ورود و MFA، شناسهاش در
SESSION_CONTEXT قرار میگیرد.
- RLS فقط ردیفهای مجاز را برمیگرداند.
- برای دسترسی بینواحدی، مجوز صریح و زماندار ثبت میشود.
- مشاهده، دانلود، چاپ، تأیید و دسترسی ناموفق در Audit Log ثبت میشود.
احراز هویت + MFA
Session Context
RLS و Permission
تحویل امن فایل
Audit Event
معماری پیشنهادی
Identity Provider
ورود سازمانی، MFA، قفل حساب و توکن کوتاهعمر.
Application / API
تنها مسیر مجاز برای مشاهده، دانلود و درخواست دسترسی.
SQL Server
متادیتا، نسخهها، نقشها، RLS، گردش تأیید و ممیزی.
Secure Storage
رمزگذاری فایل، اسکن بدافزار و URL امضاشده کوتاهعمر.
Key Management
کلیدها در HSM یا Key Vault و خارج از جداول عادی.
SIEM / Backup
هشدار رفتار غیرعادی، Backup رمزگذاریشده و نسخه غیرقابلتغییر.
سطوح امنیتی
| سطح |
نمونه |
قاعده |
| عمومی |
راهنمای برند |
انتشار پس از تأیید |
| داخلی |
راهنمای کارکنان |
کارمند فعال + MFA |
| محرمانه |
حقوق و قرارداد |
سطح کافی + همان واحد یا مجوز صریح + واترمارک |
| سری |
معماری شبکه |
مشاهده امن و دانلود/چاپ پیشفرض غیرفعال |
| بهکلی سری |
ادغام و تملک |
مجوز موقت، تأیید ارشد و ثبت دقیق |
نمای کلی جداول
| جدول |
عنوان |
کاربرد |
org.Departments |
واحدهای سازمانی |
ساختار درختی شرکت و تفکیک واحد مالک یا مصرفکننده سند |
sec.SecurityLevels |
سطوح طبقهبندی |
تعریف سطح عمومی تا بهکلی سری و قواعد پایه هر سطح |
sec.Users |
کاربران |
هویت کاربردی، واحد سازمانی و حداکثر سطح مجاز |
sec.Roles / sec.UserRoles |
نقشها و عضویت |
مدیریت RBAC و تاریخ اعتبار نقشهای هر کاربر |
doc.Categories |
دستهبندی سند |
ساختار درختی موضوعات مالی، حقوقی، فنی و مدیریتی |
doc.RetentionPolicies |
سیاست نگهداری |
مدت نگهداری و اقدام پایان عمر سند |
doc.Documents |
سند اصلی |
متادیتا، مالک، واحد، سطح امنیت و وضعیت چرخه عمر |
doc.DocumentVersions |
نسخههای فایل |
هر نسخه فیزیکی با مسیر، هش، کلید مرجع و وضعیت اسکن |
doc.Tags / doc.DocumentTags |
برچسبها |
جستوجو و گروهبندی چندبهچند |
sec.DocumentPermissions |
مجوزهای صریح |
Allow یا Deny برای کاربر یا نقش و تفکیک عملیات |
sec.AccessRequests |
درخواست دسترسی |
گردش تأیید، دلیل کسبوکاری و اعتبار زمانی |
audit.UserSessions |
نشستهای کاربر |
ورود، خروج، IP، دستگاه، MFA و ابطال نشست |
audit.ActivityTypes |
فرهنگ رویداد |
View، Download، Print، Share، Login و AccessDenied |
audit.DocumentActivities |
لاگ ممیزی |
چه کسی، چه سندی، چه زمانی، از کجا و با چه نتیجهای استفاده کرده است |
واحدهای سازمانی org.Departments
ساختار درختی شرکت و تفکیک واحد مالک یا مصرفکننده سند.
| فیلد کلیدی |
نوع |
توضیح |
DepartmentID |
INT |
کلید اصلی |
DepartmentCode |
VARCHAR(20) |
کد یکتا |
DepartmentName |
NVARCHAR(150) |
نام واحد |
ParentDepartmentID |
INT |
واحد بالادستی |
IsActive |
BIT |
وضعیت |
سطوح طبقهبندی sec.SecurityLevels
تعریف سطح عمومی تا بهکلی سری و قواعد پایه هر سطح.
| فیلد کلیدی |
نوع |
توضیح |
SecurityLevelID |
TINYINT |
کلید اصلی |
LevelCode |
VARCHAR(30) |
کد فنی |
SortOrder |
TINYINT |
رتبه مقایسه |
RequiresMFA |
BIT |
الزام MFA |
AllowDownload |
BIT |
قاعده پایه دانلود |
DefaultWatermark |
BIT |
واترمارک پیشفرض |
کاربران sec.Users
هویت کاربردی، واحد سازمانی و حداکثر سطح مجاز.
| فیلد کلیدی |
نوع |
توضیح |
UserID |
INT |
کلید اصلی |
Username |
NVARCHAR(100) |
نام کاربری یکتا |
DepartmentID |
INT |
واحد |
ClearanceLevelID |
TINYINT |
سطح مجوز |
LockedUntil |
DATETIME2 |
قفل حساب |
RowVersion |
ROWVERSION |
کنترل همزمانی |
نقشها و عضویت sec.Roles / sec.UserRoles
مدیریت RBAC و تاریخ اعتبار نقشهای هر کاربر.
| فیلد کلیدی |
نوع |
توضیح |
RoleID |
INT |
کلید نقش |
RoleCode |
VARCHAR(50) |
کد نقش |
UserID |
INT |
کاربر عضو |
ValidUntil |
DATETIME2 |
پایان اعتبار |
IsActive |
BIT |
وضعیت |
دستهبندی سند doc.Categories
ساختار درختی موضوعات مالی، حقوقی، فنی و مدیریتی.
| فیلد کلیدی |
نوع |
توضیح |
CategoryID |
INT |
کلید اصلی |
CategoryCode |
VARCHAR(30) |
کد |
CategoryName |
NVARCHAR(150) |
عنوان |
ParentCategoryID |
INT |
دسته والد |
سیاست نگهداری doc.RetentionPolicies
مدت نگهداری و اقدام پایان عمر سند.
| فیلد کلیدی |
نوع |
توضیح |
RetentionPolicyID |
INT |
کلید اصلی |
RetentionYears |
SMALLINT |
مدت |
DispositionAction |
VARCHAR(20) |
Review/Archive/Destroy |
RequiresApproval |
BIT |
نیاز به تأیید |
سند اصلی doc.Documents
متادیتا، مالک، واحد، سطح امنیت و وضعیت چرخه عمر.
| فیلد کلیدی |
نوع |
توضیح |
DocumentID |
INT |
کلید اصلی |
DocumentNumber |
NVARCHAR(50) |
شماره یکتا |
Title |
NVARCHAR(300) |
عنوان |
DepartmentID |
INT |
واحد؛ NULL یعنی سراسری |
OwnerUserID |
INT |
مالک |
SecurityLevelID |
TINYINT |
سطح امنیتی |
DocumentStatus |
VARCHAR(20) |
وضعیت |
IsDeleted |
BIT |
حذف نرم |
نسخههای فایل doc.DocumentVersions
هر نسخه فیزیکی با مسیر، هش، کلید مرجع و وضعیت اسکن.
| فیلد کلیدی |
نوع |
توضیح |
DocumentVersionID |
BIGINT |
کلید نسخه |
DocumentID |
INT |
سند والد |
VersionNumber |
NVARCHAR(20) |
نسخه |
StoragePath |
NVARCHAR(1000) |
مسیر امن |
FileHashSHA256 |
VARBINARY(32) |
هش یکپارچگی |
EncryptionKeyRef |
NVARCHAR(300) |
مرجع کلید |
VirusScanStatus |
VARCHAR(20) |
اسکن بدافزار |
IsCurrent |
BIT |
نسخه جاری |
برچسبها doc.Tags / doc.DocumentTags
جستوجو و گروهبندی چندبهچند.
| فیلد کلیدی |
نوع |
توضیح |
TagID |
INT |
کلید |
TagName |
NVARCHAR(100) |
عنوان |
DocumentID |
INT |
سند مرتبط |
مجوزهای صریح sec.DocumentPermissions
Allow یا Deny برای کاربر یا نقش و تفکیک عملیات.
| فیلد کلیدی |
نوع |
توضیح |
PermissionID |
BIGINT |
کلید |
PrincipalType |
VARCHAR(10) |
User/Role |
Effect |
VARCHAR(5) |
Allow/Deny |
CanView |
BIT |
مشاهده |
CanDownload |
BIT |
دانلود |
CanEdit |
BIT |
ویرایش |
ExpiresAt |
DATETIME2 |
انقضا |
درخواست دسترسی sec.AccessRequests
گردش تأیید، دلیل کسبوکاری و اعتبار زمانی.
| فیلد کلیدی |
نوع |
توضیح |
AccessRequestID |
BIGINT |
کلید |
RequestedBy |
INT |
درخواستکننده |
RequestedAction |
VARCHAR(20) |
عملیات |
BusinessReason |
NVARCHAR(1000) |
دلیل |
RequestStatus |
VARCHAR(20) |
وضعیت |
ReviewedBy |
INT |
بررسیکننده |
نشستهای کاربر audit.UserSessions
ورود، خروج، IP، دستگاه، MFA و ابطال نشست.
| فیلد کلیدی |
نوع |
توضیح |
SessionID |
UNIQUEIDENTIFIER |
شناسه نشست |
UserID |
INT |
کاربر |
LoginAt/LogoutAt |
DATETIME2 |
بازه |
IPAddress |
VARCHAR(45) |
IP |
IsMfaVerified |
BIT |
MFA |
IsRevoked |
BIT |
ابطال |
فرهنگ رویداد audit.ActivityTypes
View، Download، Print، Share، Login و AccessDenied.
| فیلد کلیدی |
نوع |
توضیح |
ActivityTypeID |
SMALLINT |
کلید |
ActivityCode |
VARCHAR(40) |
کد |
RiskWeight |
TINYINT |
وزن ریسک |
لاگ ممیزی audit.DocumentActivities
چه کسی، چه سندی، چه زمانی، از کجا و با چه نتیجهای استفاده کرده است.
| فیلد کلیدی |
نوع |
توضیح |
ActivityID |
BIGINT |
کلید |
RequestID |
UNIQUEIDENTIFIER |
شناسه درخواست |
UserID |
INT |
کاربر |
DocumentID/VersionID |
INT/BIGINT |
سند و نسخه |
OccurredAt |
DATETIME2 |
زمان UTC |
IsSuccessful |
BIT |
نتیجه |
DownloadedBytes |
BIGINT |
حجم دانلود |
WatermarkCode |
NVARCHAR(100) |
کد واترمارک |
PrevEventHash/EventHash |
VARBINARY(32) |
زنجیره تشخیص دستکاری |
منطق کنترل دسترسی
اسکریپت از SESSION_CONTEXT('AppUserId') و Row-Level Security استفاده میکند. قاعده دسترسی به این ترتیب است:
- کاربر فعال باشد و حساب قفل نباشد.
- مجوز صریح
Deny بر Allow و دسترسی پایه مقدم است.
- مالک سند و مدیر سامانه دسترسی پایه دارند.
- سطح مجوز کاربر حداقل برابر سطح سند باشد.
- برای اسناد واحدی، کاربر عضو همان واحد باشد؛ سند سراسری محدودیت واحد ندارد.
- مجوز صریح کاربر یا نقش میتواند دسترسی موقت بینواحدی بدهد.
EXEC sec.usp_SetAppUserContext @Username = N'maryam.finance'; EXEC doc.usp_ListAccessibleDocuments;
نکته امنیتی: AppUserId نباید از ورودی خام مرورگر گرفته شود. فقط پس از اعتبارسنجی Token و روی Connection کنترلشده تنظیم شود.
ثبت سوابق مشاهده و دانلود
جدول audit.DocumentActivities کاربر، نشست، سند، نسخه، نوع عملیات، زمان UTC، IP، دستگاه، نتیجه، حجم دانلود، واترمارک و JSON تکمیلی را نگه میدارد.
Procedure درج رویداد، هش رکورد قبلی را در payload رکورد جدید وارد میکند. بنابراین حذف یا تغییر یک رویداد وسط زنجیره با audit.usp_ValidateActivityHashChain قابل تشخیص است.
زنجیره هش جایگزین SQL Server Audit، Ledger یا ذخیره WORM نیست؛ یک لایه تکمیلی تشخیص دستکاری در سطح برنامه است.
EXEC audit.usp_ValidateActivityHashChain;
لایههای امنیتی مکمل
Row-Level Security
کنترل ردیفها در خود موتور دیتابیس.
TDE
رمزگذاری فایلهای دیتابیس و Backup در حالت سکون.
Always Encrypted
محافظت از ستونهای بسیار حساس با کلید خارج از محیط DB.
SQL Server Audit
ثبت رویدادهای سطح سرور و دیتابیس در مقصد مستقل.
Least Privilege
نقش برنامه فقط EXECUTE روی Procedureها و SELECT محدود دارد.
DLP و Watermark
کنترل خروج اطلاعات، چاپ و انتساب فایل به دریافتکننده.
کوئریهای تمرینی
چه کسی چه سندهایی را دیده است؟
SELECT FullName, DocumentNumber, Title, COUNT(*) AS ViewCount, MAX(OccurredAt) AS LastViewedAt FROM audit.vw_DocumentAccessHistory WHERE ActivityCode = 'VIEW' AND IsSuccessful = 1 GROUP BY FullName, DocumentNumber, Title ORDER BY LastViewedAt DESC;
دانلودهای موفق
SELECT FullName, DocumentNumber, Title, OccurredAt, DownloadedBytes, WatermarkCode, IPAddress FROM audit.vw_DocumentAccessHistory WHERE ActivityCode = 'DOWNLOAD' AND IsSuccessful = 1 ORDER BY OccurredAt DESC;
دسترسیهای ناموفق
SELECT OccurredAt, Username, DocumentNumber, ActivityName, FailureReason, IPAddress, DeviceName FROM audit.vw_DocumentAccessHistory WHERE IsSuccessful = 0 OR ActivityCode = 'ACCESS_DENIED' ORDER BY OccurredAt DESC;
روش اجرای فایل SQL
- فایل را در SQL Server Management Studio باز کنید.
- آن را روی یک Instance آزمایشگاهی اجرا کنید.
- دیتابیس
CorporateDMS_Lab ساخته میشود.
- دادههای نمونه شامل ده سند، سیزده نسخه، هشت کاربر و سی رویداد ثبت میشود.
- در انتهای فایل، گزارشهای نمونه بهصورت خودکار اجرا میشوند.

نکات ضروری محیط تولید
- رمز عبور واقعی را با Identity Provider و الگوریتمهایی مانند Argon2id یا bcrypt مدیریت کنید؛ هشهای نمونه SQL صرفاً آموزشیاند.
- اتصال مستقیم برنامه به جداول Audit ممنوع و عملیات فقط از Procedureهای محدود انجام شود.
- کلیدهای فایل و TDE در HSM/Key Vault نگهداری و دورهای چرخانده شوند.
- SQL Server Audit، Backup رمزگذاریشده، تست بازیابی، SIEM و ذخیره غیرقابلتغییر فعال شود.
- مجوزهای موقت خودکار منقضی و حساب کارکنان جداشده فوراً غیرفعال شود.
- اسکن بدافزار، DLP، واترمارک پویا و لینک دانلود یکبارمصرف اعمال شود.