# پایگاه‌های داده > SQL Server > T-SQL >  خلوت کردن لاگ

## modern_amin

سلام
من لاگ کاربر رو هنگام ورود  در نرم افزار میگیرم و در جدول بنام Tlog  ذخیره میکنم
فیلدهای این جدول این سه تا هست
id_log---name---tarikh

حالا میخام کمی دیتابیس رو خلوت تر کنم
میخام زمانی که در جدول Tlog  اینسرت انجام میدم بصورت خودکار از هر کاربر فقط  3 سطر اخرش بمونه و بقیه لاگ های قدیمی تر پاک بشه

نکته مهم اینکه میخام این اتفاق به سریع ترین حالت ممکن بیفته تا رم و سی پی یو
رو زیاد درگیر نکنه چون ممکنه در لحظه 500 کاربر بخان لاگین داشته باشند

----------


## hamid_hr

یه چیزی شبیه به این میشه

DECLARE @t TABLE (id INT IDENTITY(1,1), Name VARCHAR(100), Tarikh VARCHAR(15))
-------old log------------------
INSERT INTO @t
(
    Name,
    Tarikh
)
VALUES
(   'hamid', -- Name - varchar(100)
    '1398/07/05'  -- Tarikh - varchar(15)
    ),('hamid','1398/07/06'),('hamid','1398/07/08')
    ,('hamid','1398/07/06'),('hamid','1398/07/07')
    ,('ali','1398/07/06'),('ali','1398/07/07')
    ,('hamid','1398/07/09')

---- new Insert ---------------
INSERT @t
(
    Name, Tarikh
)
VALUES
(   'hamid', '1398/07/09'  )
DELETE @t WHERE id < (SELECT MIN(id) FROM (SELECT TOP (3) id FROM @t WHERE name = 'hamid' ORDER BY id DESC) t)
AND name = 'hamid'

SELECT * FROM @t

----------


## modern_amin

سلام بر شما
ممنونم از پاسخگویی شما
بنظرم این کد افرادی که مثلا بار اول دارند لاگین میکنند (به اون حد 3 نرسیدن)  رو هم پاک میکنه که نباید اینگونه باشه   :ناراحت:

----------


## modern_amin

> یه چیزی شبیه به این میشه
> 
> DECLARE @t TABLE (id INT IDENTITY(1,1), Name VARCHAR(100), Tarikh VARCHAR(15))
> -------old log------------------
> INSERT INTO @t
> (
>     Name,
>     Tarikh
> )
> ...



سلام بر شما
ممنونم از پاسخگویی شما
بنظرم این کد افرادی که مثلا بار اول دارند لاگین میکنند (به اون حد 3 نرسیدن) رو هم پاک میکنه که نباید اینگونه باشه

----------


## hamid_hr

> بنظرم این کد افرادی که مثلا بار اول دارند لاگین میکنند (به اون حد 3 نرسیدن) رو هم پاک میکنه که نباید اینگونه باشه


نه اینطور نیست. سه تا لاگ رو همیشه نگه میداره

----------


## modern_amin

> نه اینطور نیست. سه تا لاگ رو همیشه نگه میداره


شما داری top 3  رو میگیری و بعد ازین سه تا کوچترین id  رو میگیری
خب اگر 3 سطر موجود نباشه یک سطر رو برمیگرده و کوچکترین id هم میشه خودش.. :متفکر:

----------


## modern_amin

البته میشه با استفاده از    IF EXIST و شرط

 Having count(*)>3

این مشکل رو حل کرد

----------


## modern_amin

بنظر شما این اتفاقی که همزمان پاک بشه بعد اینسرت  بهتره 
یا توسط ادمین سیستم هر از چندگاهی این اتفاق بیفته؟؟

(از بعد فشار نیامدن به سرور تاثییر داره یا خیر؟)

----------


## hamid_hr

> بنظر شما این اتفاقی که همزمان پاک بشه بعد اینسرت  بهتره 
> یا توسط ادمین سیستم هر از چندگاهی این اتفاق بیفته؟؟


بنظر من بهتره لاگ رو نگه دارین و ادمین بیاد اونا رو حذف کنه یا مثلا تاریخ های یک ماه یا یک سال به قبل حذف بشه
البته همه اینها به نوع سیستم و تحلیلتون بستگی داره و ممکنه یه سیستم امنیتی باشه و لازم باشه همه ی لاگ ها رو نگه داره

----------


## hamid_hr

> خب اگر 3 سطر موجود نباشه یک سطر رو برمیگرده و کوچکترین id هم میشه خودش..


خب کوچکتر از ای دی خودش با اون یوزر وجود نداره و حذف نمیشه

----------


## RED-C0DE

اگه نرخ درج و ویرایش و حذف روی جدول بالا باشه، این کارتون زیاد بهینه نیس.

اگه scale محیط کاربریتون بزرگ هست، یه راه حل خوب، اینه که عملیات پاکسازی لاگ رو بصورت (مثلا) شبانه در تایمی که بار پردازشی سرور کم هست، انجام بدین.
یعنی از عملیات بیزینس اصلی، این کار رو جدا کنین.

یا حتی دیتابیس جداگانه ای در نظر بگیرین. یا روی FileGroup جداگانه ای قرار بدین.

----------

