2014-08-28 3 views
0

컴퓨터 및/사용자로부터 몇 가지 기본 인벤토리 정보를 수집하는 .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() 
+0

왜 응용 프로그램에서 감사하고 있습니까, 즉 데이터베이스 반 패턴입니까? – HLGEM

+0

나는 어딘가에 버그가 있어도 중복을 피하기 위해'asset.assetid'를 프라이 머리 키로 만들 것을 제안합니다. 나는 또한 모든 문장을'begin transaction' /'commit'으로 감쌀 것을 제안한다. – wdosanjos

+0

BTW, 문제는 저장된 proc를 호출하는 콘솔 응용 프로그램이나 콘솔 응용 프로그램이 실행을 위해 트리거되는 방식에 있다고 생각합니다. – wdosanjos

답변

0

이 방법의 세부 사항과 함께 콘솔 응용 프로그램의 코드를 보지 않고이 문제를 진단하는 데 쉬운 일이 아닙니다 그것은 작동한다. 예를 들어, 여러 개의 인스턴스를 실행할 수 있고 동시에 두 개의 스레드가 동일한 작업을 수행 할 수 있습니까?

추가 할 인벤토리 항목이있을 때 콘솔 응용 프로그램을 두 번 실행하여 중복되는지 확인할 수 있습니다. 이 안된

IF EXISTS (SELECT 1 FROM asset WHERE [email protected]) 
    -- Create an asset row if it doesn't exist 
    BEGIN 
     SELECT @assetid = assetid FROM asset WHERE [email protected] 
    END 
ELSE 
    --Add asset to table  
    BEGIN 
     INSERT INTO asset (serial,model,manufacturer) 
     VALUES (@serial,@model,@manufacturer); 

     SELECT @assetid = SCOPE_IDENTITY() 
    END 

,하지만 당신은 아이디어를 얻을한다 : 나는 어느 정도를 다시 작성합니다 있지만

저장 프로 시저의 논리는, 잘 보인다.

+0

위의 추가 된 콘솔 코드를 참조하십시오. 아주 간단한 프로그램입니다. 그것은 하나의 스레드이므로 어떤 함수도 두 번 실행하지 않습니다.WMI에서 데이터를 모으고 변수에 저장하고 저장 프로 시저를 통해 db에 저장합니다. –

관련 문제