Bryn Llewellyn <b...@yugabyte.com> writes:
> I want to demonstrate how to meet this requirement:

> «
> Encapsulate each business function in a user-defined subprogram that hides 
> all the implementation details like table names and the SQL statements that 
> manipulate their contents so the they cannot be seen using SQL issued from 
> the client. Further, don't allow raw errors to escape to the client. Rather, 
> if an expected error occurs (like a unique key violation), then report this 
> as an application-specific code that translates to, for example, "This 
> nickname is already taken. Choose a different one." And if an "others" error 
> occurs (typically because the programmer forgot to cater for it—like a 
> too-wide varchar value) insert diagnostic info into an incident log table and 
> return an "unexpected error" application-specific code together with the 
> incident ID so that it can be reported to Support.
> »

> I've written proof-of-concept code that shows how to meet this requirement 
> for most scenarios. But it seems to be impossible to meet the requirement for 
> errors that occur at commit time.

So ... avoid those?  It seems like it's only a problem if you use deferred
constraints, and that's not a necessary feature.

> Is there simply no way that inserts into table "t" in my example can be 
> encapsulated in PL/pgSQL so that the error from the failing trigger can be 
> handled rather there than escaping, raw, to the client?

If you want a strict view of that you probably need to be doing the
encapsulation on the client side.  There's nothing you can do on the
server side that would prevent, say, network-connection failures
"escaping" to the client.  And that's actually one of the harder
cases to deal with: if the connection drops just after you issue
COMMIT, you can't tell whether the transaction got committed.

                        regards, tom lane


Reply via email to