<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=DatabaseAdmin</id>
	<title>DatabaseAdmin - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=DatabaseAdmin"/>
	<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=DatabaseAdmin&amp;action=history"/>
	<updated>2026-08-22T05:27:07Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=DatabaseAdmin&amp;diff=818&amp;oldid=prev</id>
		<title>Admin: 3 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=DatabaseAdmin&amp;diff=818&amp;oldid=prev"/>
		<updated>2016-04-06T20:08:44Z</updated>

		<summary type="html">&lt;p&gt;3 revisions imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The following is a brief overview of the RT (3.0.x) schema and some tips on examining the database. Also, very occasionally you may wish to modify the database directly (e.g. delete bogus information).&lt;br /&gt;
&lt;br /&gt;
How to do these things is roughly described here.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Nobody guarantee that this document describes all relations in the database.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Making direct modifications to the database is &amp;#039;&amp;#039;&amp;#039;not recommended&amp;#039;&amp;#039;&amp;#039;, but is sometimes required. Should you do so, ensure that you backup your database first, and ensure its integrity afterwards.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
The RT [[DBSchema]] can be thought of in 5 broad groupings:&lt;br /&gt;
&lt;br /&gt;
* Groups and Users (groups, users, groupmembers, cachedgroupmembers, principals, acl)&lt;br /&gt;
* Templates and Scrips (scripconditions, scripactions, scrips, templates)&lt;br /&gt;
* Infrastructure (queues, customfields, customfieldvalues)&lt;br /&gt;
* Tickets and related information (tickets, transactions, ticketcustomfieldvalues, links, attachments)&lt;br /&gt;
* Sessions&lt;br /&gt;
&lt;br /&gt;
In mysql or postgresql you can use the following commands to examine the schema:&lt;br /&gt;
&lt;br /&gt;
* help&lt;br /&gt;
* help command&lt;br /&gt;
* \dt [ table ]&lt;br /&gt;
* \ds [ sequence ]&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
Each object is identified uniquely by an integer id (sequence) which is incremented for each new object.&lt;br /&gt;
&lt;br /&gt;
You can see the relationships among objects by following id linkages. e.g.&lt;br /&gt;
&lt;br /&gt;
* ticket -&amp;amp;gt; queue&lt;br /&gt;
* ticketcustomfieldvalue -&amp;amp;gt; ticket&lt;br /&gt;
* transaction -&amp;amp;gt; ticket&lt;br /&gt;
* link -&amp;amp;gt; target&lt;br /&gt;
* attachment -&amp;amp;gt; transactionid&lt;br /&gt;
&lt;br /&gt;
== Danger way to delete tickets ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Original author forget a lot of details.&amp;lt;br /&amp;gt;&lt;br /&gt;
1) RT creates role groups for each ticket.&amp;lt;br /&amp;gt;&lt;br /&gt;
2) Attachments have parent/child relationship.&amp;lt;br /&amp;gt;&lt;br /&gt;
3) Each role group has principal record.&amp;lt;br /&amp;gt;&lt;br /&gt;
4) each role group can have members&amp;lt;br /&amp;gt;&lt;br /&gt;
5) each reacord in group members has one or more related records in cached group members. IMHO you shouldn&amp;#039;t use this process to delete any records in RT DB&amp;lt;br /&amp;gt;&lt;br /&gt;
--[[RuslanZakirov]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Also original author suggest to use copy&amp;amp;amp;paste method to delete related records that is bad dy design. --[[RuslanZakirov]]&lt;br /&gt;
&lt;br /&gt;
If you &amp;#039;&amp;#039;&amp;#039;really must&amp;#039;&amp;#039;&amp;#039; delete or modify an object, first determine all linkages to that object. e.g.&lt;br /&gt;
&lt;br /&gt;
* select * from tickets where id = &amp;amp;lt;some id&amp;amp;gt;;&lt;br /&gt;
* select id from transactions where ticket = &amp;amp;lt;your ticket id&amp;amp;gt;;&lt;br /&gt;
* select id from ticketcustomfieldvalues where ticket = &amp;amp;lt;your ticket id&amp;amp;gt;;&lt;br /&gt;
* select id from links where target = &amp;amp;lt;your ticket id&amp;amp;gt;;&lt;br /&gt;
* select id from attachments where transactionid = &amp;amp;lt;your transaction id&amp;amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Then to delete a given ticket, use the following:&lt;br /&gt;
&lt;br /&gt;
* delete from attachments where id in ( &amp;amp;lt;attachment ids&amp;amp;gt; );&lt;br /&gt;
* delete from links where id in ( &amp;amp;lt;link ids&amp;amp;gt; );&lt;br /&gt;
* delete from ticketcustomfieldvalues where id in ( &amp;amp;lt;ticketcustomfieldvalue ids&amp;amp;gt; );&lt;br /&gt;
* delete from transactions where id in ( &amp;amp;lt;transaction ids&amp;amp;gt; );&lt;br /&gt;
* delete from tickets where id = &amp;amp;lt;your ticket id&amp;amp;gt;;&lt;br /&gt;
&lt;br /&gt;
If you have a large number of bogus tickets to delete you could use a script (perl, shell, sql) to determine which tickets need to be deleted and to do the deletion.&lt;br /&gt;
&lt;br /&gt;
== ANOTHER NOTE: ==&lt;br /&gt;
&lt;br /&gt;
As a new ticket is being inserted, records are also generated in the following tables: principals, cachedgroupmembers, groupmembers, groups. So, as you delete a ticket, you also want to purge records that directly or indirectly reference a range of tickets to be deleted from these tables.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DO NOT USE THIS RECIPE. PLEASE USE RT SHREDDER, BUILT IN TO RT 3.8 AND NEWER&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You may want to do something like this (in addition to the steps above):&lt;br /&gt;
&lt;br /&gt;
 1) define tickets to delete:&lt;br /&gt;
   $tickets_to_delete = &amp;quot;age(tickets.resolved) &amp;amp;gt; &amp;#039;6 months&amp;#039;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 2) delete tickets and all related records:&lt;br /&gt;
 - delete from principals where&lt;br /&gt;
     id=groups.id and groups.instance=tickets.id as int)&lt;br /&gt;
     and $tickets_to_delete;&lt;br /&gt;
 - delete from cachedgroupmembers where groupid=groups.id&lt;br /&gt;
     and groups.instance=tickets.id and $tickets_to_delete;&lt;br /&gt;
 - delete from groupmembers where groupid=groups.id and&lt;br /&gt;
     groups.instance=tickets.id and $tickets_to_delete;&lt;br /&gt;
 - delete from groups where instance=tickets.id and $tickets_to_delete;&lt;br /&gt;
 &lt;br /&gt;
                                                     -AnyaFiglin&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>