Meysam's Experiences

MeyEx ,محلی برای انتشار تجربیات من در زمینه های مرتبط با حوزه ی تولید نرم افزار

Meysam's Experiences

MeyEx ,محلی برای انتشار تجربیات من در زمینه های مرتبط با حوزه ی تولید نرم افزار

Meysam's Experiences

در زمینه ی تولید نرم افزار فعالیت دارم. نوشته های این بلاگ به طور خاص در مورد تمامی زمینه هایی که منتهی به تولید نرم افزار و یا تجربیاتی که در محیط کاریم کسب می کنم خواهند بود. [البته فعلا به دلیل مشغله های جانبی دیگر و داشتن مخاطب در آن حوزه ها, مطالب کمی غیر نرم افزار شده است!]
در این بلاگ سعی شده که مطالب به صورت تخصصی و دسته بندی شده منتشر شوند

تابلوی اعلانات
جدیدترین نظرات

۲ مطلب با موضوع «MS SQL Server» ثبت شده است

۰۱
تیر
۹۳

کدام Service، کدام User ؟

سوالی که افراد بسیاری در پروسه نصب Sql Server در بخشی که مربوط به انتخاب کاربر برای هر کدام از سرویس های سیکوئل سرور هست، می پرسند.
در واقع چندین انتخاب وجود دارد.

من به شخصه در زمان نصب SQL Server با این سوال مواجه بودم و نتایج جستجو بر روی اینترنت و سوال و جواب از دوستان فنی؛ نتیجه ی مثبت و منحصری را حاصل نمی کرد. تا اینکه در آخرین جستجو که به سایت MSDN منتهی شد به مطلبی برخورد کردم؛ که مطالب ذیل ترجمه ایست آزاد از آن.

برای اجرای هر کدام از سرویس های سیکوئل سرور, هر کدام از آن ها باید یک حساب کاربری که در طی مراحل نصب تنظیم شده اند, داشته باشند. این حساب های کاربری که برای شروع و اجری سیکوئل سرور به کار می روند می توانند یک حساب کاربری از نوع built-in یا local user یا domain user باشند.

ذیلا به تشریح هر کدام پرداخته شده است.

  • میثم هوشمند
۱۷
فروردين
۹۳

در زمان پیاده سازی دیتابیس یک پروژه؛ چیزی که توجهم را به خود جلب کرد این بود که چهار فیلد ( InsertedBy, InsertDateTime, ModifiedBy, ModifyDateTime ) در تمامی جداول (98%) تکرار شده بود, طبیعتا ایجاد 232 فیلد (4 فیلد تکراری در 58 جدول) تکراری کار خسته کننده ای هست.

خب چرا از طریق یک داینامیک کوئری این کار را به صورت اتوماتیک انجام ندهیم؟

به این صورت که با استفاده از یک کرزر (Cursor) لیست جداول دیتابیس  پیمایش می شوند, سپس به ازای هر یک از جداول, با استفاده از دو کوئری ابتدا وجود فیلد مورد نظر بررسی می شود, و در صورت عدم وجود آن؛ کوئری اضافه شدن فیلد اجرا می شود.

به کد زیر دقت کنید:

USE My_DB
GO

DECLARE @TableName VARCHAR(30)
DECLARE @Query VARCHAR(MAX)
DECLARE AlterTable_Cursor CURSOR
FOR
SELECT SCHEMA_NAME(schema_id) + '.' + t.name
FROM sys.tables AS t
OPEN AlterTable_Cursor
FETCH NEXT FROM AlterTable_Cursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN

SET @Query = 'IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''InsertedBy'')
ALTER TABLE ' + @TableName + ' ADD InsertedBy int not NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''InsertDateTime'')
ALTER TABLE ' + @TableName + ' ADD InsertDateTime datetime not NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''ModifiedBy'')
ALTER TABLE ' + @TableName + ' ADD ModifiedBy int NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''ModifyDateTime'')
ALTER TABLE ' + @TableName + ' ADD ModifyDateTime datetime NULL
'
--PRINT @Query
EXEC(@Query)
FETCH NEXT FROM AlterTable_Cursor INTO @TableName
END
CLOSE AlterTable_Cursor
DEALLOCATE AlterTable_Cursor

توجه: می توان در صورت نیاز ابتدا ستون موجود را حذف و مجددا اقدام به ایجاد آن نمود؛

همچنین دقت داشته باشید در صورتی که جداول شما دارای رکورد باشند؛ برای ایجاد ستون هایی که Not Null می باشند؛ پیغام خطا صادر خواهد شد.

با کمی دقت و حوصله می توان این کوئری را با صورت دلخواه درآورد و از انجام مشقت بار کارهای تکراری از این دست جلوگیری نمود.

  • میثم هوشمند