The answer varies entirely from application to application. Though I cannot define a new trigger event, I can simply change the use case.
If I were to exchange information, I will ask the other system to configure their side, to accept what my application is capable of delivering. Modern interface engine, which come embedded in the product itself, have check boxes around to define what need to be interpreted as patient admit, update etc.
Because My application is build on few specifications, and most of the time the recieving application collects this data and configures their side. It could be an EMR or a PMS at the other hand, but this handshake agreement is required before you can setup your interface.
If during the handshake I see that I cannot digest what you are going to send to me, than I unfortunately have to call it off or see new workaround or log a Dev ticket to get it done.
Most of the application follow specific pattern, with only minor changes in one or two events. Now, Let's say I define my system and call A04 as register a patient and A08 and update a patient. HL7 job is to specify or just carry A08 and A04 in the respective fields. However, on the other side the application need to interpret as required.
So What exactly happens at the message level- Nothing different.
Earlier in the A04 it was carrying JHON DOE as patient name. Later on in the subsequent A08 it carried JOHN DOE patients Demographics, with the same MRN in PID.2. That's it.
Discharges and Transfers A02 and A03 appear on INpatients only, but I have not ever seen them being used (cos I have always worked on Outpatients). I can use for transfers, A02,A06,A07,A25,A26 and A27 and likewise.
Is HL7 an exact science? - NO. What defined are possible events that occur in Healthcare system, the interpretation however, can change on a case to case basis. Its job is to convey certain information in certain fields as defined. You can't really send SSN in Patient ID field. Cos that is illogical and an abuse to HL7.
I hope that helps. :)