PDA

View Full Version : ثبت فعالیتهای کاربران مختلف



negar.rafie
دوشنبه 17 شهریور 1393, 19:11 عصر
سلام
من یه برنامه دارم که چند کاربرداره و هر دفعه میان لاگین می کنن و از نرم افزار استفاده می کنن
حالا می خوام فعالیتهای کاربران را ثبت کنم و مشخص بشه هر کاربر در طول کار با نرم افزار چه کارهایی را انجام دادن
مثلا هر کاربر چه رکوردی حذف کرده یا اضافه کرده و . . .
ممنون

fakhravari
دوشنبه 17 شهریور 1393, 21:39 عصر
یه کلاس پرسنل تعریف کن.
باید در موقع اجرای رویداد ها اسم شخص با نوع رویداد توی یه جدول ثبت کنی

farhad.k.t
سه شنبه 18 شهریور 1393, 22:53 عصر
همانطور که جناب fakhravari فرمودند یک table برای ثبت logها و... ایجاد کنید و با استفاده از تریگر ها تغییرات اعمال شده را در آن table بریزید...
(تریگر ها Event هایی هستند که در چهارچوب جدول تعریف شده و به محض اجرای یکی از اعمالinsert,update,delete اجرا می شوند...)

negar.rafie
سه شنبه 18 شهریور 1393, 22:57 عصر
میشه بیشتر توصیح بدید

fakhravari
سه شنبه 18 شهریور 1393, 22:57 عصر
خب یک مسئله
در تریگر نام کاربرا ها و موارد اضافی چطور پاس بدن !!

farhad.k.t
سه شنبه 18 شهریور 1393, 23:20 عصر
با استفاده از جداول منطقی inserted و deleted

به شکل زیر:
Create TRIGGER [dbo].[trg_insert_forosh] ON [dbo].[tblforosh]
after insert
AS

BEGIN
declare @tedad int
declare @id int
select @id=id from inserted
select @tedad =tedad from inserted
select @kala=kala from inserted
insert into tbllogs values(@id,@tedad,@kala)
END

veniz2008
سه شنبه 18 شهریور 1393, 23:25 عصر
سلام
من یه برنامه دارم که چند کاربرداره و هر دفعه میان لاگین می کنن و از نرم افزار استفاده می کنن
حالا می خوام فعالیتهای کاربران را ثبت کنم و مشخص بشه هر کاربر در طول کار با نرم افزار چه کارهایی را انجام دادن
مثلا هر کاربر چه رکوردی حذف کرده یا اضافه کرده و . . .
ممنون
سلام.
همانطور که در پیام خصوصی هم اشاره کردید، نیاز به جدولی دارید که این اطلاعات رو ذخیره کنید.
فیلدهای این جدول می تونه حداقل شامل یوزرنیم (کد کاربر)، نام عمل مورد نظر،نام جدول (جدولی که روش عملیات انجام شده) و تاریخ عملیات باشه. (اطلاعات بیشتر می تونه شامل جزییاتی از رکورد(های) حذف شده باشه).
این بحث رو که مطرح کردید، اشاره به یک موضوع دیگه هم خالی از لطف نیست اونم بحث Trigger ها در SQL هست.
مثلا ممکنه نخواید اجازه delete از جدول رو به هیچکس بدید(بیشتر توی سیستم بایگانی ازش استفاده می کنیم که اجازه حذف رو ندیم) و اگر کسی خواست این کار رو انجام بده، تاریخ این عمل رو ثبت کنید یا اینکه اجازه حذف بدید ولی بعد از حذف، تاریخ حذف رو جایی ثبت کنید. توجه کنید که trigger فقط برای حذف نیست و می تونید برای drop,create و Alter (اصطلاحا بهشون DDL Trigger گفته میشه) یا برای insert, delete, update (اصطلاحا بهشون DML Trigger میگن) از Trigger ها استفاده کنید.
در کل اینجا قصد توضیح دادن Trigger ها رو نداشتم و فقط خواستم گوشه ذهنتون این مطلب رو هم داشته باشید که اگر چنین نیازهایی رو در آینده داشتید می تونید از Trigger ها کمک بگیرید.
موفق باشید.

veniz2008
سه شنبه 18 شهریور 1393, 23:47 عصر
با استفاده از جداول منطقی inserted و deleted

به شکل زیر:
Create TRIGGER [dbo].[trg_insert_forosh] ON [dbo].[tblforosh]
after insert
AS

BEGIN
declare @tedad int
declare @id int
select @id=id from inserted
select @tedad =tedad from inserted
select @kala=kala from inserted
insert into tbllogs values(@id,@tedad,@kala)
END
دوست عزیز، همونطور که در توضیحات ایجاد کننده تاپیک هم اومده، قصد دارند بدونن چه کاربری اقدام به حذف رکورد کرده، در صورتیکه جداول Inserted و Deleted به ترتیب رکوردهای جدید درج شده و رکوردهای جدید حذف شده رو بر می گردونه و ارتباطی به اطلاعات کاربری که این عملیات رو انجام داده نداره.
در مثالی هم که خودتون زدید اون id و tedad و kala فیلدهای جدول هستن و بعد از یک DML Trigger که از نوع After و برای عملیات Insert استفاده شده، جدیدترین رکورد درج شده در جدول رو بیرون کشیدید و اطلاعاتی درباره کاربری که این کار رو انجام داده در این جداول موجود نیست.

negar.rafie
چهارشنبه 19 شهریور 1393, 10:17 صبح
ممنون اقای veniz2008
حالا باید چکار کنیم باید از تریگر استفاده کنیم؟
میشه همراه با کد توضیح بدید

NasimBamdad
چهارشنبه 19 شهریور 1393, 11:23 صبح
دوست عزیز، همونطور که در توضیحات ایجاد کننده تاپیک هم اومده، قصد دارند بدونن چه کاربری اقدام به حذف رکورد کرده، در صورتیکه جداول Inserted و Deleted به ترتیب رکوردهای جدید درج شده و رکوردهای جدید حذف شده رو بر می گردونه و ارتباطی به اطلاعات کاربری که این عملیات رو انجام داده نداره.
در مثالی هم که خودتون زدید اون id و tedad و kala فیلدهای جدول هستن و بعد از یک DML Trigger که از نوع After و برای عملیات Insert استفاده شده، جدیدترین رکورد درج شده در جدول رو بیرون کشیدید و اطلاعاتی درباره کاربری که این کار رو انجام داده در این جداول موجود نیست.


ممنونم بابت مثال و توضیح کاملتون .

این تریگر که ساخته شده که فکر کنم برای Insert می باشد . حالا چه طوری از این تریگر استفاده کنیم ؟ یعنی خروجی اش رو چه طوری استفاده کنیم که جواب رو داشته باشیم ؟

veniz2008
چهارشنبه 19 شهریور 1393, 12:03 عصر
حالا باید چکار کنیم باید از تریگر استفاده کنیم؟
میشه همراه با کد توضیح بدید
اگر می خواید اطلاعات کاربر رو هم داشته باشید، Trigger نمی تونه بهتون کمک کنه چون قابلیت ارسال پارامتر( ارسال کد کاربر) به Trigger وجود نداره.
از Trigger در حالاتی که براتون در پست های قبلی مثال زدم، استفاده کنید.
من اینجا هر چقدرم که بخوام توضیح بدم باز هم نمیشه کل مطلب رو توضیح داد.
ما دو حالت کلی برای اجرا شدن یک تریگر داریم :
1. حالت After : زمانی صورت می گیره که عمل مورد نظر (insert,delete و ...) با موفقیت انجام بشه. یعنی به محض اجرای موفقیت آمیز یک عملیات، در صورتیکه برای اون عملیات یک تریگر از نوع After تعریف کرده باشید، بصورت اتوماتیک توسط sql انجام میشه. مثلا دستور داخل تریگر می تونه ثبت اطلاعات حذف شده (با استفاده از جدول deleted) باشه یا هر کار دیگه ای که خودتون دوست دارید (فقط توجه کنید که امکان ارسال پارامتر ندارید).
2. حالت Instead Of : زمانیکه قراره عمل مورد نظر (insert,delete و ...) انجام بشه، به جای (Instead Of) عمل مورد نظر شما دستور تریگر شما اجرا میشه. مثلا برای یک جدول بایگانی که اسمش روی خودشه و تاریخچه اطلاعات برامون مهمه، برای عمل delete یک تریگر از نوع Instead Of تعریف می کنید که دستور داخلش می تونه ثبت تاریخ این کار در یک جدول دیگه باشه. یعنی به جای اینکه دستور delete روی جدول بایگانی انجام بشه، تاریخ انجام این عمل رو در یک جدول دیگه انجام می دیم. این می تونه در پیاده سازی امنیت یک دیتابیس بسیار مفید باشه.
یکی از خوبی هایی که تریگر داره اینه که سمت SQL انجام میشه، یعنی اگه حتی کاربری مستقیما بخواد روی دیتابیس عملی انجام بده ( چه از نوع DML یا از نوع DDL) سریعا sql واکنش نشون میده و کاری رو که شما براش تعیین کردید رو انجام میده، این باعث میشه که امنیت دیتابیس و در نتیجه امنیت پروژه شما بالا بره و امکان دور زدن برنامه در این موضوع وجود نداشته باشه.


این تریگر که ساخته شده که فکر کنم برای Insert می باشد . حالا چه طوری از این تریگر استفاده کنیم ؟ یعنی خروجی اش رو چه طوری استفاده کنیم که جواب رو داشته باشیم ؟
تریگری که می نویسید با توجه به نوع و مدلش، بصورت اتوماتیک توسط sql اجرا میشه و اینطور نیست که نیاز به فراخوانی و صدا زدن داشته باشه.
در مثال دوستمون، به محض اجرای دستور Insert بر روی جدول tblforosh، ابتدا از جدول Inserted که یک جدول مخصوص و از پیش تعریف شده برای تریگرهاست، فیلدهای مورد نیازش از جدیدترین (آخرین) رکورد درج شده رو بیرون کشیده و حالا اومده این فیلدها رو در یک جدول دیگه به نام tbllogs درج کرده. در این مثال رکورد(هایی) برگشت داده نمیشه بلکه یک insert در جدول tbllogs صورت می گیره.
اگر می خواید تریگر برای شما چیزی برگردونه با دستور select اون چیزی که مد نظرتون هست رو برگشت بدید و با یک dataadapter یا datareader خروجی برگشت داده شده رو دریافت کنید.
مثلا اگر تریگر از نوع delete (یا insert یا هر نوعی) باشه می تونید بعد از انجام موفقیت آمیز عمل مورد نظر، جدیدترین مقادیر موجود در جدول رو برگشت بدید (یعنی داخل تریگر یه select به جدول مورد نظرتون می نویسید). خوبی این روش اینه که اگر عمل delete یا ... با موفقیت انجام بشه، اون موقع دستور داخل تریگر اجرا میشه در غیر اینصورت تریگر انجام نمیشه و در نتیجه کار اضافه ای هم انجام نمیشه.

negar.rafie
چهارشنبه 19 شهریور 1393, 12:18 عصر
پس با این حساب تریگر به درد من نمیخوره
یعنی باید بیام مثلا هر وقت کاربر خواست یک رکورد اضافه کنه یه دستور insert هم برای ثبت در جدول فعالیتها بنویسم؟

fakhravari
چهارشنبه 19 شهریور 1393, 12:50 عصر
به تریگر که نمیشه پارامتر ورودی داد که موارد اضافه را وارد کنید.

mreram
چهارشنبه 19 شهریور 1393, 14:03 عصر
من یه تریگر درست کردم و توی جدولم ایجاد شده حالا چطوری میتونم حذفش کنم؟؟

محمد آشتیانی
چهارشنبه 19 شهریور 1393, 14:10 عصر
سلام


پس با این حساب تریگر به درد من نمیخوره
یعنی باید بیام مثلا هر وقت کاربر خواست یک رکورد اضافه کنه یه دستور insert هم برای ثبت در جدول فعالیتها بنویسم؟

به نظر میرسه شما نیاز داری یه متد بنویسی و موقع نیاز برای ثبت Log فراخوانی کنیش ، شبیه به این

private void SaveLog(int UserId,int LogType, string LogDate, string LogTime, string LogDescription)
{
//Code insert dar LogTable
}

پارامترهای ورودی متد میتونه بسته به نیاز شما تغییر کنه.

موفق باشید

sohil_ww
چهارشنبه 19 شهریور 1393, 14:30 عصر
من تو اینجور مواقع متدی تو کلاسی وظیفه ای برقراری ارتباط با بانک بر عهده داره می نویسیم که درصورتی اعمالی که مورد نظرم هستن از قبیل درج و ویرایش و حذف اون مدت و اجرا می کنم که این امر باعث می شه اطلاعاتم تو جدول log ذخیره بشه

veniz2008
چهارشنبه 19 شهریور 1393, 17:09 عصر
من یه تریگر درست کردم و توی جدولم ایجاد شده حالا چطوری میتونم حذفش کنم؟؟
برای حذف یک تریگر از جدول، هم می تونید با کدنویسی این کار رو انجام بدید و هم از طریق ویزارد خود sql ( منظور همون Sql server management studio هستش).
با کد نویسی :

Use DataBaseName
drop trigger TriggerName

برای حذف از طریق ویزارد :
در محیط Management Studio و از پنجره Object Explorer که ساختار درختی تمامی اجزای Sql Server سیستم درونش هست، می تونید با زدن علامت + کنار جدول مورد نظر، به تریگر مورد نظر دسترسی داشته باشید. با راست کلیک بر روی تریگر امکاناتی از جمله ویرایش تریگر، ایجاد اسکریپت از تریگر، فعال یا غیر فعال کردن تریگر و همچنین حذف تریگر رو در اختیار خواهید داشت که برای حذف باید از گزینه Delete استفاده کنید.
123294

negar.rafie
چهارشنبه 19 شهریور 1393, 17:24 عصر
ممنون
یه جدول داخل sqlایجاد کردم
و یک تابع هم داخل کدها
و زمانی که مثلا کاربر میخواد رکوردی addکنه یه رکورد هم به اون جدول addمیکنم که چه کاربری چه رکوردی addکرده یا حذف و سایر فعالیت ها

mreram
چهارشنبه 19 شهریور 1393, 18:29 عصر
برای حذف یک تریگر از جدول، هم می تونید با کدنویسی این کار رو انجام بدید و هم از طریق ویزارد خود sql ( منظور همون Sql server management studio هستش).
با کد نویسی :

Use DataBaseName
drop trigger TriggerName

برای حذف از طریق ویزارد :
در محیط Management Studio و از پنجره Object Explorer که ساختار درختی تمامی اجزای Sql Server سیستم درونش هست، می تونید با زدن علامت + کنار جدول مورد نظر، به تریگر مورد نظر دسترسی داشته باشید. با راست کلیک بر روی تریگر امکاناتی از جمله ویرایش تریگر، ایجاد اسکریپت از تریگر، فعال یا غیر فعال کردن تریگر و همچنین حذف تریگر رو در اختیار خواهید داشت که برای حذف باید از گزینه Delete استفاده کنید.
123294

مرسی ولی من sql server نصب نکردم و تریگر رو با ویژوال استدیو ایجاد کردم و حذف نداره و مجبور شدم جدول رو حذف کنم ...ولی فکر کنم با کوئری drop میشد حذفش کرد