<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Jerrad,<br>
<br>
It looks to me as though the actual User record is missing from the
USER Table. The reason the history croaks is because RT is walking thru
the ticket history and there is a reference to a UserID that no longer
exists. You need to look at the Transaction history to determine what
is missing. This is what I have been doing:<br>
<br>
1) Find all transactions for a ticket that might refer to a User. I use
this SQL:<br>
Select *<br>
from TRANSACTIONS<br>
where OBJECTTYPE = 'RT::Ticket'<br>
  and Type in ('AddWatcher', 'DelWatcher', 'Force', 'Give', 'Steal',
'Take', 'Untake');<br>
<br>
Select *<br>
from TRANSACTIONS<br>
where OBJECTTYPE = 'RT::Ticket'<br>
  and CREATOR in (61876);<br>
<br>
This will allow you to determine the UserID that is missing. Then I
look for all instances for that User:<br>
<br>
Select *<br>
from TRANSACTIONS<br>
where OBJECTTYPE = 'RT::Ticket'<br>
  and Type in ('AddWatcher', 'DelWatcher', 'Force', 'Give', 'Steal',
'Take', 'Untake')<br>
  and NewValue in ('61876'); I also use this with "NewValue as well.<br>
<br>
Once you do this for all missing Users, you will have a list of who is
missing.<br>
<br>
2) Next, I check all the various Tables that could have references to
the missing UserID:<br>
<br>
Select *<br>
from GROUPMEMBERS<br>
where MEMBERID in (61876);<br>
<br>
Select *<br>
from ACL<br>
Where ObjectType = 'RT::Queue'<br>
and PRINCIPALID in (61876);<br>
<br>
select *<br>
from CACHEDGROUPMEMBERS<br>
where MEMBERID in (61876, 61877);<br>
<br>
Select *<br>
from ATTRIBUTES<br>
where CREATOR in (61876)<br>
   or OBJECTID in (61876);<br>
<br>
Select *<br>
from TICKETS<br>
where OWNER in (61876)<br>
  or  CREATOR in (61876)<br>
  or  LASTUPDATEDBY in (61876);<br>
<br>
Select * <br>
from ATTACHMENTS<br>
where CREATOR in (161876);<br>
<br>
For referencing purposes, I also look for every ticket where that User
was used:<br>
<br>
Select *<br>
from GROUPS<br>
where INSTANCE = 61876;<br>
<br>
This last SQL will give an Id number based on the type of  group/role.
There will be a Group record for each instance of use per ticket. If
that User is a Requestor and an owner, there will be 2 records one with
type = "Requestor" and one with type = "owner".. Each will point to the
ticket with that particular relationship. The Domain field will
describe the relationship ie. "RT::Ticket-Role".<br>
<br>
Anyway, I think you get the jist of this. Once you do this for each and
every missing User, you will be able to <i>manually modify</i> these
records using SQL. This is how:<br>
<br>
<ol>
  <li>Create a new user that will be, in fact, a replacement for the
missing one.</li>
  <li>Once you have created the new user, you will have a new UserID
that corresponds to this new User.</li>
  <li>That new UserID is what you put into all those table records that
are using the OLD UserID.</li>
</ol>
This has to be done manually because the old UserID is missing. So, you
have to replace all the references to that OLD ID with the NEW ID. Does
that make sense?<br>
<br>
Kenn<br>
LBNL<br>
<br>
<br>
On 12/8/2009 2:22 PM, Jerrad Pierce wrote:
<blockquote
 cite="mid:be7163f0912081422h4a6b6adcqc9cb98faea528b86@mail.gmail.com"
 type="cite">
  <blockquote type="cite">
    <pre wrap="">I suspect that the ticket history for any tickets with these users as
requestors will error out. This has happened to me before. I can show you
how to fix it, but I will need some info.
    </pre>
  </blockquote>
  <pre wrap=""><!---->Nope, we actually have several tickets in that state, where part way through
the display of transaction history RT croaks. This ticket displays fine, though
it (now) has "no requestor," and I cannot find the requestor via the search
form on the modify people page, nor the admin user search form. However the
original requesting user exists, and can be loaded in the modify user page if
the correct id is specified in the URL, or via Shredder's search results.

  </pre>
  <blockquote type="cite">
    <pre wrap="">First, get the UserID for each of these missing Requestors. Once we have
those, we will have to run a series of SQL commands to find out just who is
missing and what tickets are affected, including closed tickets. I hope you
are familiar with SQL. What Database are you using? We're on Oracle,
but the sequence of events should still be the same.
    </pre>
  </blockquote>
  <pre wrap=""><!---->It might be worth posting this Shredder recovery as a how-to to the wiki.

Additional details: mysqlcheck reports no errors, and there is nothing of
consequence in the logs. We recently upgraded from 3.8.1 to 3.8.6, and
I did perform the database upgrades. I'm not sure if the problem existed
before the switch, but it seems doubtful given the frequency of the activity
(spreadsheet dumping) that lead me to uncover this.

None of our local customizations seem likely candidates to be interfering
with this, especially on such a limited basis:

local/lib/RT/Transaction_Local.pm -- recognize VCF is text
local/lib/RT/CustomFields_Local.pm -- simplified code, switch sort order
local/lib/RT/Interface/Email/Filter/SpamAssassin.pm
local/lib/RT/Interface/Email_Local.pm -- tag parser with Q in ticket ID
local/lib/RT/Interface/Web_Local.pm -- long life cookies
local/lib/RT/Shredder/Plugin/Users.pm -- search on other fields: real, name
local/lib/RT/Shredder/Plugin/Attachments.pm -- minimum file size

  </pre>
</blockquote>
</body>
</html>