PDA

View Full Version : خلوت کردن لاگ



modern_amin
شنبه 13 مهر 1398, 11:41 صبح
سلام
من لاگ کاربر رو هنگام ورود در نرم افزار میگیرم و در جدول بنام Tlog ذخیره میکنم
فیلدهای این جدول این سه تا هست
id_log---name---tarikh

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

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

hamid_hr
شنبه 13 مهر 1398, 15:16 عصر
یه چیزی شبیه به این میشه

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
شنبه 13 مهر 1398, 21:22 عصر
سلام بر شما
ممنونم از پاسخگویی شما
بنظرم این کد افرادی که مثلا بار اول دارند لاگین میکنند (به اون حد 3 نرسیدن) رو هم پاک میکنه که نباید اینگونه باشه :ناراحت:

modern_amin
شنبه 13 مهر 1398, 21:30 عصر
یه چیزی شبیه به این میشه

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



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

hamid_hr
یک شنبه 14 مهر 1398, 12:13 عصر
بنظرم این کد افرادی که مثلا بار اول دارند لاگین میکنند (به اون حد 3 نرسیدن) رو هم پاک میکنه که نباید اینگونه باشه
نه اینطور نیست. سه تا لاگ رو همیشه نگه میداره

modern_amin
یک شنبه 14 مهر 1398, 13:03 عصر
نه اینطور نیست. سه تا لاگ رو همیشه نگه میداره

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

modern_amin
یک شنبه 14 مهر 1398, 13:09 عصر
البته میشه با استفاده از IF EXIST و شرط

Having count(*)>3

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

modern_amin
یک شنبه 14 مهر 1398, 13:11 عصر
بنظر شما این اتفاقی که همزمان پاک بشه بعد اینسرت بهتره
یا توسط ادمین سیستم هر از چندگاهی این اتفاق بیفته؟؟

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

hamid_hr
دوشنبه 15 مهر 1398, 10:40 صبح
بنظر شما این اتفاقی که همزمان پاک بشه بعد اینسرت بهتره
یا توسط ادمین سیستم هر از چندگاهی این اتفاق بیفته؟؟
بنظر من بهتره لاگ رو نگه دارین و ادمین بیاد اونا رو حذف کنه یا مثلا تاریخ های یک ماه یا یک سال به قبل حذف بشه
البته همه اینها به نوع سیستم و تحلیلتون بستگی داره و ممکنه یه سیستم امنیتی باشه و لازم باشه همه ی لاگ ها رو نگه داره

hamid_hr
دوشنبه 15 مهر 1398, 10:41 صبح
خب اگر 3 سطر موجود نباشه یک سطر رو برمیگرده و کوچکترین id هم میشه خودش..
خب کوچکتر از ای دی خودش با اون یوزر وجود نداره و حذف نمیشه

RED-C0DE
سه شنبه 28 آبان 1398, 14:03 عصر
اگه نرخ درج و ویرایش و حذف روی جدول بالا باشه، این کارتون زیاد بهینه نیس.

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

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