컴퓨터 및/사용자로부터 몇 가지 기본 인벤토리 정보를 수집하는 .net 콘솔 응용 프로그램을 만들었습니다. 저장 프로 시저를 통해이 정보를 SQL Server 2012 데이터베이스로 덤프합니다.저장 프로 시저가 간혹 두 번 실행됩니다.
두 개 이상의 테이블에서 중복 레코드가 가끔 발생합니다.
저장 프로 시저가 매우 간단합니다. 저장 프로 시저가 일련 번호 (다른 매개 변수 중에서)를 받으면 일련의 자산 테이블을 검색합니다. 일치가 발견되면 assetId
이 리턴되고, 그렇지 않으면 새 항목이 작성되고 새로 작성된 assetId
이 리턴됩니다. 또한이 프로시 듀어에서 날짜 시간 항목이 이전에 리턴 된 assetId
을 사용하여 이벤트 테이블에 추가됩니다.
자산 테이블에 두 개의 레코드가 있는데, 일련 번호가 assetId
이지만 일련 번호가 같습니다. 흥미로운 점은 이벤트 테이블에 의 각각에 해당하는 두 개의 레코드가 있으며 이는 모두 date_time
입니다.
우리가 가지고있는 22,000 대 컴퓨터 중에서 이것은 5 개의 일련 번호에서만 발생 했으므로 나를위한 세계의 끝이 아닙니다. 그러나, 나는이 문제로 인해 나머지 데이터의 신뢰성에 대해 질문을 받았다.
어떻게 생각하세요? 절차
을 저장
--Create an asset row if there is not one and retrieve the id. Or just retrieve the id. If (select count(assetid) from asset where [email protected]) > 0 Begin set @assetid = (select top 1 assetid from asset where [email protected]) End Else --Add asset to table Begin Insert into asset (serial, model, manufacturer) values (@serial, @model, @manufacturer); set @assetid = (Select SCOPE_IDENTITY()) End --End Asset entry --Insert Audit Event record Insert into auditevent (assetid, audittime, username, computername, operatingsystem) values (@assetid, @audittime, @username, @computername, @operatingsystem) Declare @auditeventid int = (select SCOPE_IDENTITY()) --Send the ipString to the function that will convert it to a table and insert into IP Table Insert into ipaddress (auditeventid, ipaddress) select * from CsvToTable(@auditeventid, @ipaddressvalues)
콘솔 응용 프로그램 (단일 스레드)
Dim strExcutionCommand As String = "dbo.auditclient @computername=N'" & strComputerName & "',@modeltext=N'" & strModel & "',@serial=N'" & strSerialNumber & "',@username=N'" & strUserName & "',@manufacturertext=N'" & strManufacturer & "',@operatingsystemtext=N'" & strOperatingSystem & "',@ipaddressvalues=N'" & strNetAddress & "'"
Dim Inv_ConnectString As String = "Data Source=cen-support01;Initial Catalog=IT_Inventory;User Id=" & strSqlUser & ";Password=" & strSqlPw & ";"
Dim myConnection As SqlConnection = New SqlConnection(Inv_ConnectString)
Dim myCommand As SqlCommand = New SqlCommand(strExcutionCommand, myConnection)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
왜 응용 프로그램에서 감사하고 있습니까, 즉 데이터베이스 반 패턴입니까? – HLGEM
나는 어딘가에 버그가 있어도 중복을 피하기 위해'asset.assetid'를 프라이 머리 키로 만들 것을 제안합니다. 나는 또한 모든 문장을'begin transaction' /'commit'으로 감쌀 것을 제안한다. – wdosanjos
BTW, 문제는 저장된 proc를 호출하는 콘솔 응용 프로그램이나 콘솔 응용 프로그램이 실행을 위해 트리거되는 방식에 있다고 생각합니다. – wdosanjos