PowerBuilder classic, currently using PB 2017
SQL Server
I have a large old PowerBuilder application + satellite applications. Like many large old PowerBuilder applications it uses SQLCA for 99% of its transaction handling. It also uses stored procedures, datawindows, and embedded SQL to update data.
We want to add auding via database triggers, so we can track anything that changes data in the database no matter who write the application in question. We'd like to know what application and what window was being used when the update took place, when the updates come from our applications
As far as I can tell I either have to pass that information in with every SQL statement, something that's not going to be possible, or use the SQL Server SET CONTEXT_INFO command to store 128 bytes of useful information that the triggers can read. However since a user could be using multiple windows at the same time(ish, I mean it is a single transaction, and that could get confusing) that not really going to cover it.
So I think I need to change every window to have its own transaction, and that's a lot of quite difficult work that I'm not relishing.
Anyone have any ideas as to the best way to go about this?
Note: The trigger generator is written and working, and in use, are is all the SET CONTEXT_INFO stuff, it's just a matter of updating the large behemoth applications to use the triggers (currently turned off via a single SET CONTEXT_INFO call)
Some things I am thinking of:
* Bah, don't worry about two windows a tthe same time, it's not as if PowerBuilder / our application can really handle that, I mean wouldn't commits and rollbacks get all confused already??? (Is that true?)
* Use the SQLPreview event to call SET CONTEXT_INFO everywhere, perhaps reading the call stack to get the required information (see fastfuncs for more details https://github.com/lakeman/fastfuncs)
* Shut up and get on with creating a single transaction for each window
Thanks, any thoughts are welcome :)
Unfortunately our application logs on to the database as a single user with our user id stored on the client end, so to know who made the change, which is a pretty important thing, we have to be able to use CONTEXT_INFO (or, I suppose, pass it on with every call, which would be a lot of work) which isn't something any in-built auditing uses as far as I can see.
Also we have to support all editions of SQL Server from 2008 R2 up, as well as customers with small or large servers.
There are also several other requirements in that client-side auditing is already implemented in parts of the code (i.e. after doing an update another updates it called to create an audit record) along with reports and filters and all the stuff so the user can find the information they're interested in. The new audit triggers will continue to use the same tables allowing for the reports etc to carry on working.
If only I was designing a brand-new application there are so many nice features nowadays.