We have a third party application that connects to an oracle database using a generic login. This application has a connection dialog that allows you to select a schema to connect to and I want to restrict some people from using some of those schemas. I created the trigger below which fires when someone first logons to the foo schema, it checks a table that I have created and if they are in the table then it alters their session to the one I have specified in the table. I have found that if someone switches schemas, then this doesn't fire. If I logon to fooey schema and then so an "alter session set current_schema = foo" then the trigger is not fired. I assume since I am not loging into a schema but merely switching schema that this is why it doesn't fire. How do I get this to fire when someone switches schemas? Is this the wrong trigger type? I looked at the list of triggers that I could create but didn't see anything that looked correct.
create or replace trigger user_logon
after logon on foo.schema
declare
nRowCount number;
sDef_Schema varchar(64);
sOS_User varchar(64);
BEGIN
SELECT SYS_CONTEXT('US ERENV', 'OS_USER') INTO sOS_User FROM DUAL;
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM valid_users where OS_USER = ''' || sOS_User || '''' INTO
nRowCount;
if nRowcount > 0 then
EXECUTE IMMEDIATE 'SELECT DEFAULT_SCHEMA from valid_users where OS_USER = ''' || sOS_User || ''''
INTO sDef_Schema;
EXECUTE IMMEDIATE 'alter session set current_schema = ' || sDef_Schema;
end if;
END;
create or replace trigger user_logon
after logon on foo.schema
declare
nRowCount number;
sDef_Schema varchar(64);
sOS_User varchar(64);
BEGIN
SELECT SYS_CONTEXT('US ERENV', 'OS_USER') INTO sOS_User FROM DUAL;
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM valid_users where OS_USER = ''' || sOS_User || '''' INTO
nRowCount;
if nRowcount > 0 then
EXECUTE IMMEDIATE 'SELECT DEFAULT_SCHEMA from valid_users where OS_USER = ''' || sOS_User || ''''
INTO sDef_Schema;
EXECUTE IMMEDIATE 'alter session set current_schema = ' || sDef_Schema;
end if;
END;
Comment