SQL관련 이벤트로그만 따로 뽑아내어 DB에 저장하도록 해봤습니다.

 

우선 이벤트로그 내용을 저장할 테이블을 생성합니다.

USE [DBA]

GO 

SET ANSI_NULLS ON

GO 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE TABLE [dbo].[PSEventLog](

 [Index] [int] NOT NULL,

 [ComputerName] [nvarchar](250) NOT NULL,

 [EventID] [int] NOT NULL,

 [Category] [int] NOT NULL,

 [InstanceId] [bigint] NOT NULL,

 [EventType] [nvarchar](10) NOT NULL,

 [Message] [nvarchar](4000) NULL,

 [Source] [nvarchar](250) NOT NULL,

 [TimeGenerated] [datetime] NULL,

 [TimeWritten] [datetime] NOT NULL

) ON [PRIMARY]

GO



우선 SQL 스냅인을 이용하여 진행해보겠습니다.
그럼 스냅인을 로드하지요

Add-PSSnapin SqlServerProviderSnapin100
Add-PSSnapin SqlServerCmdletSnapin100

$logs = Get-EventLog -LogName "Application" | Where-Object {$_.Source -like "*SQL*"} | Where-Object {$_.EntryType -eq "Error"} | select-object *
$sQuery = "use DBA;begin tran;"
foreach ($log in $logs)
{       
        $Index = $log.Index
        $MachineName = $log.MachineName
        $EventID = $log.EventID
        $CategoryNumber = $log.CategoryNumber
        $InstanceId = $log.InstanceId
        $EntryType = $log.EntryType
        $Message = $log.Message.Replace("'","")
       
        $Source = $log.Source
        $TimeGenerated = $log.TimeGenerated
        $TimeWritten = $log.TimeWritten
 
        $sQuery += "INSERT INTO PSEventLog VALUES ($Index,'$MachineName',$EventID,$CategoryNumber,$InstanceId,'$EntryType','$Message',                       
'$Source','$TimeGenerated','$TimeWritten');"}
$sQuery += "commit;"
Write-Host $sQuery;
Invoke-Sqlcmd -Query $sQuery -ServerInstance "SPACESHIPS\"

스냅인 사용시에는 Invoke-SqlCmd로 쿼리만 날리면 되니 순식간에 처리가 되었습니다.


그럼 두번째로 닷넷라이브러리를 이용해 C#스타일로 진행해보겠습니다.
위에 사용한 sQuery 파라미터는 그대로 사용한다고 가정하고요...

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString ="Server=SPACESHIPS; Database=DBA;Integrated Security=true"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection
$Command.CommandText = $sQuery
$res =$Command.ExecuteNonQuery()
$Connection.Close()
Write-Host $res + "행이 적용되었습니다."



에러가 많은게 자랑은 아니지만 ^^;; 간단하게 아래와 같은 결과가 저장되었습니다.

140D6D024CD7B84E4F45C7


위의 스크립트를 가공해서 이미 등록된 이벤트는 삭제하고 신규만 등록되게 하면 DBA분들 관리하시기에 좀 도움이 되지 않을까요... ^^





profile

안녕하세요 우주인입니다 ^^;;