PDB_OS_CREDENTIAL and PL/SQL external libraries

In the previous blog post I have described PDB_OS_CREDENTIAL initialization parameter and when it can help you in isolating PDBs from each other. Today I’ll show you an example of how it works with PL/SQL external libraries.

Of course we need to setup the whole environment first, but I provided the pointers already in the previous post. Let’s start with creating our simple code in C, which will return the current UID of the user running it.

$ vi run_id.c
int run_id() {
  return getuid();

We have to compile it and copy to our $ORACLE_HOME/lib directory (I want to keep this example as simple as possible, without playing with any additional parameters or environment variables).

-- Compile the program
$ gcc -fPIC -c run_id.c

-- Generate shared object
$ ld -shared -o run_id.so run_id.o

-- Set proper permissions and copy shared object to $ORACLE_HOME/lib
$ chmod 755 run_id.so
$ cp run_id.so $ORACLE_HOME/lib

This allows to create library object in our PDB and then simple function using it:

SQL> alter session set container = test001;

SQL> create library run_id_lib is 

SQL> create or replace function run_id_f return binary_integer as
     external name "run_id" library run_id_lib language c;

That’t it, now we can test if PDB_OS_CREDENTIAL works correctly:

SQL> select run_id_f from dual;


SQL> !id 54000
uid=54000(ora_test001) gid=53763(restricted) groups=53763(restricted)

Yes it is – ora_test001 user has been used, instead of oracle :).

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s