I would not attempt this with a Script Task - it is too difficult to compare across rows.
I would add a Fuzzy Grouping Transformation to group on the name columns. This will add a _key_out column (amongst others). I would drop the results into a SQL table.
Then I would write a complex SQL query featuring a GROUP BY on the _key_out column, and CASE statements for each of the other columns to resolve your "is missing" and "conflicting" requirements.
Once you point this at a real-world dataset of any scale, the benefits of this design will really pay off. You will undoubtably encounter more complex scenarios that your examples above e.g. DB1 has 2 "John Smith" rows and DB2 has 3 "John Smith" rows. You will be able to tweak the Fuzzy Grouping parameters and/or add secondary Fuzzy Groupings to break ties.
Along the way you can interrogate the results in the intermediate SQL table to optimize the handling of these issues.