Java 将标识符附加到Oracle会话

Java 将标识符附加到Oracle会话,java,database,oracle,hibernate,Java,Database,Oracle,Hibernate,我的Java应用程序通过Hibernate使用db会话 我想做的是,当我在应用程序中创建会话时,将该会话标识为“应用程序”会话。原因是我希望(通过before触发器)限制用户可以对表进行的更新,同时允许应用程序全权执行它喜欢的操作 换句话说,我的触发器执行以下操作: if(user is an application) allow update else raise oracle error end if 有人知道最好的方法吗?在触发器中写下以下内容: select term

我的Java应用程序通过Hibernate使用db会话

我想做的是,当我在应用程序中创建会话时,将该会话标识为“应用程序”会话。原因是我希望(通过before触发器)限制用户可以对表进行的更新,同时允许应用程序全权执行它喜欢的操作

换句话说,我的触发器执行以下操作:

if(user is an application)
   allow update
else
   raise oracle error
end if

有人知道最好的方法吗?

在触发器中写下以下内容:

select 
  terminal, 
  username, 
  osuser, 
  program 
into 
  svTerminal, svUserName, svOSUser, svProgram

from
  v$session 
where 
  audsid=SYS_CONTEXT('USERENV','SESSIONID');

if svProgram <> 'MyApplicationTitle' then
  raise oracle error
end if;
如果触发器未编译,则应向具有v$session触发器的用户授予select权限。您可以通过在系统中执行以下操作来实现这一点:

grant select on sys.v_$session to <username>;
将sys.v_u$session上的选择授予;

更新:v_$session中的下划线不是错误。这是sys中的真实名称,可以在其中提供授权。v$会话是一个别名,您可以在查询中使用。

在触发器中写入以下内容:

select 
  terminal, 
  username, 
  osuser, 
  program 
into 
  svTerminal, svUserName, svOSUser, svProgram

from
  v$session 
where 
  audsid=SYS_CONTEXT('USERENV','SESSIONID');

if svProgram <> 'MyApplicationTitle' then
  raise oracle error
end if;
如果触发器未编译,则应向具有v$session触发器的用户授予select权限。您可以通过在系统中执行以下操作来实现这一点:

grant select on sys.v_$session to <username>;
将sys.v_u$session上的选择授予;

更新:v_$session中的下划线不是错误。这是sys中的真实名称,可以在其中提供授权。v$会话是一个可以在查询中使用的别名。

将权限授予角色,然后将应用程序设置为该角色可能更简单


将特权授予角色,然后让应用程序设置该角色可能更简单


其他人可以编写一个假装是你的应用程序,假设他们的机器上有你的应用程序。我假设你知道这一点,并且可以相信你的用户没有这样的能力。其他人可以编写一个假装是你的应用程序,假设他们的机器上有你的应用程序。我假设你知道这一点,并且可以相信你的用户不具备这样的能力。这很容易被愚弄。例如,你可以将sqlplusw.exe重命名为MyApplicationTitle,触发器不会注意到这一点。这很容易被愚弄。例如,您可以将sqlplusw.exe重命名为MyApplicationTitle,触发器不会注意到这一点。