Video Screencast Help
Search Video Help Close Back
to help
New in the Rewards Catalog: Vouchers for "Symantec Technical Specialist" and "Symantec Certified Specialist" exams.

Merge Duplicate Computer Records in Deployment Server

Updated: 11 Oct 2010 | 5 comments
CondorMan's picture
+16 18 Votes
Login to vote

Occasionally, the Deployment Server console will show multiple computers with the same computer name. I have created a SQL Query that will merge these duplicate records. To use this SQL Query, open SQL Query Analyzer or Management Studio, create a new query, select your Deployment Server Database (eXpress) as the active database from the drop-down list of databases, copy and paste the following query text into the Query Window, and then execute the query. Everything following a “--” is a comment to help you understand what it does.

--Create a table variable to pair duplicate records for merging
DECLARE @ComputerIDs TABLE
(
  NewCompID int,
  OldCompID int
)
--Find all computers with more than one ID. The larger number is the younger computer record, the smaller number is the older computer record.
INSERT INTO @ComputerIDs (NewCompID, OldCompID)
  SELECT MAX(computer_id) AS NewCompID, MIN(computer_id) AS OldCompID
    FROM computer
    GROUP BY computer_name HAVING COUNT(1) = 2

 --Now update the younger computer record with all the data from the old computer record --Get the Group ID from the old computer record UPDATE N   SET group_id = O.group_id   FROM computer N     JOIN @ComputerIDs I ON N.computer_id = I.NewCompID     JOIN computer O ON I.OldCompID = O.computer_id

--Delete location from the new record DELETE FROM location WHERE computer_id IN (SELECT NewCompID FROM @ComputerIDs)

--Delete service processors from the new record DELETE FROM service_processor WHERE computer_id IN (SELECT NewCompID FROM @ComputerIDs)

--Move location from the old record to the new record UPDATE T SET computer_id = I.NewCompID   FROM location T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move service processors from the old record to the new record UPDATE T SET computer_id = I.NewCompID   FROM service_processor T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move config items from the old record to the new record UPDATE T SET target_computer_id = I.NewCompID   FROM config_item T     JOIN @ComputerIDs I ON T.target_computer_id = I.OldCompID

--Move event schedules from the old record to the new record UPDATE T SET computer_id = I.NewCompID   FROM event_schedule T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move history from the old record to the new record UPDATE T SET computer_id = I.NewCompID   FROM history T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID UPDATE T SET computer_id = I.NewCompID   FROM history_archive T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move status log from the old record to the new record UPDATE T SET computer_id = I.NewCompID   FROM status_log T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID UPDATE T SET computer_id = I.NewCompID   FROM status_log_archive T     JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Delete old computer records DELETE FROM computer WHERE computer_id IN (SELECT OldCompID FROM @ComputerIDs)

    

Comments

taszerl's picture
09
Apr
2009
3 Votes +3
Login to vote

I have been looking for this, But there is a work around

For the longest time I have been looking for this script, but I had no luck. Thank you for writing it, it will be helpful if what I am doing now does not work.
The only thing that I could find to make it so I do not have dupicates was to go to Tools -> Options -> Global tab and put a check next to Synchronize display names with computer names.
The only time that I would think this would not work for some is if the computer name differs from the label it is given in DS.
Again, thank you very much for posting the SQL query. Cheers

For more Linux imaging checkout TheDude05 articles

MBHarmon's picture
10
Apr
2009
1 Vote +1
Login to vote

Wow thanks for the query.  I

Wow thanks for the query.  I know we've been looking for something like this for quite awhile too.  With MAC address set as our primary key the VPN software we use can lead to multiple entries quite frequently.  This should be a huge help.

- Matt

Petrucci914's picture
19
Apr
2009
0 Votes 0
Login to vote

Not working...

I ran this, but I get the following error:

Msg 102, Level 15, State 1, Line 12
Incorrect syntax near '='.
Msg 156, Level 15, State 1, Line 41
Incorrect syntax near the keyword 'FROM'.

Any ideas?  We have several duplicate computers.......mostly because we do it by MAC Address, but then laptops that are used wired and wireless create cuplicates. 

May have to start using serial number as a lookup key.

Petrucci914's picture
19
Apr
2009
0 Votes 0
Login to vote

My bad

Looks like it is working now.  Didn't notice that there was some code included on some of the lines that had the comments.  Had to do a little editing.  Thanks!

Maymne's picture
29
Mar
2010
0 Votes 0
Login to vote

Decided to post a working

Decided to post a working version where the parts where the code bled into the comments have been fixed already, so that people (like me) who are looking for this don't need to do the work again later... Not using Preformatting, because it's doing nasty things to the alignment and so on.

--Create a table variable to pair duplicate records for merging
DECLARE @ComputerIDs TABLE
(
  NewCompID int,
  OldCompID int
)
--Find all computers with more than one ID. The larger number is the younger computer record, the smaller number is the older computer record.
INSERT INTO @ComputerIDs (NewCompID, OldCompID)
  SELECT MAX(computer_id) AS NewCompID, MIN(computer_id) AS OldCompID
    FROM computer
    GROUP BY computer_name HAVING COUNT(1) = 2
 --Now update the younger computer record with all the data from the old computer record
--Get the Group ID from the old computer record
UPDATE N
  SET group_id = O.group_id
  FROM computer N
    JOIN @ComputerIDs I ON N.computer_id = I.NewCompID
    JOIN computer O ON I.OldCompID = O.computer_id

--Delete location from the new record
DELETE FROM location WHERE computer_id IN (SELECT NewCompID FROM @ComputerIDs)

--Delete service processors from the new record
DELETE FROM service_processor WHERE computer_id IN (SELECT NewCompID FROM @ComputerIDs)

--Move location from the old record to the new record
UPDATE T SET computer_id = I.NewCompID
  FROM location T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move service processors from the old record to the new record
UPDATE T SET computer_id = I.NewCompID
  FROM service_processor T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move config items from the old record to the new record
UPDATE T SET target_computer_id = I.NewCompID
  FROM config_item T
    JOIN @ComputerIDs I ON T.target_computer_id = I.OldCompID

--Move event schedules from the old record to the new record
UPDATE T SET computer_id = I.NewCompID
  FROM event_schedule T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move history from the old record to the new record
UPDATE T SET computer_id = I.NewCompID
  FROM history T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID
UPDATE T SET computer_id = I.NewCompID
  FROM history_archive T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Move status log from the old record to the new record
UPDATE T SET computer_id = I.NewCompID
  FROM status_log T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID
UPDATE T SET computer_id = I.NewCompID
  FROM status_log_archive T
    JOIN @ComputerIDs I ON T.computer_id = I.OldCompID

--Delete old computer records
DELETE FROM computer WHERE computer_id IN (SELECT OldCompID FROM @ComputerIDs)