PDA

View Full Version : ثبت LogFile



In_Chan_Nafar
دوشنبه 29 مرداد 1386, 09:55 صبح
با سلام خدمت دوستان

تو یکی از برنامه هامون که امکان ثبت LogFile را به برنامه دادیم به مشکلی بر خوردیم:
وقتی کاربری عملی رو بر روی جدولی انجام میده عمل اون کاربر رو (افزودن - ویرایش - حذف - و ...) در جدول LogFile خودمون ثبت می کنیم حالا من دنبال راهی می گردم که با نوشتن یک SP و یا Function در SQLServer بتونم به هر جدولی که (البته جدول رو من می خوام تعیین کنم) رکوردی اضافه شد ، SQLServer خود به خود به وسیله اون SP یا Function نوشته شده یک رکورد به جدول LogFile اضافه کنه آیا همچین امکانی در SQLServer وجود داره یا من باید برای هر جدول از تریگر استفاده کنم ؟ یا برو تو SP هام و اون تابع نوشته شده رو صدا بزنم (خیلی وقت گیره)

AminSobati
دوشنبه 29 مرداد 1386, 11:21 صبح
در SQL Server 2005 این کار راهی جز Trigger که باید برای هر جدول نوشته بشه نداره. در SQL Server 2008 قابلیتی به اسم Change Data Capture وجود داره که نیازی به Trigger نیست و هر جدولی رو بخواین براحتی تحت Capture قرار میدین. اما در زمان نوشتن این پست، فکر کنم یک سال باید صبر کنین تا CDC بدستتون برسه! پس فعلا جز به Trigger به چیز دیگه ای فکر نکنین :)

S.Azish
سه شنبه 30 مرداد 1386, 12:34 عصر
دوست عزیز, اگر با SMO و یکی از زبانهای .Net Frameworkآشنایی دارید انجام اینکار خیلی مشکل نیست. کافیه یک برنامه بنویسید مثل SQL Profiler و یک Profiler Template درست کنید از اون جدولهایی که می خواهید. بعد کد زیر رو اجرا کنید :



using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Trace;
using Microsoft.SqlServer.Management.Common;


private void button1_Click(object sender, EventArgs e)
{
try
{

System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(
delegate(object arg)
{
SqlConnectionInfo ci = new SqlConnectionInfo("localhost");
ci.UseIntegratedSecurity = true;

TraceServer reader = new TraceServer();

reader.InitializeAsReader(ci, @"C:\Program Files\Microsoft SQL Server\90\Tools\Profiler\Templates\Microsoft SQL Server\90\TSQL.tdf");

while (reader.Read())
{
string result = string.Empty;

for (int i = 0; i < reader.FieldCount; i++)
{
object value = reader.GetValue(i);

if (value != null)
{
result += "---" + value.ToString();
}
}

listBox1.Invoke(new MethodInvoker(
delegate()
{
listBox1.Items.Insert(0, result);
}));


}

reader.Close();
}));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}



بدین طریق میتونید هر دستوری که روی اون جدولها انجام میشه رو ببینید و بر اساس اون log فایل رو درست کنید.

بعد میتونید از این برنامه یک ویندوز سرویس درست کنید که همیشه در حال اجرا باشه و log فایل رو پر کنه.