sql - 触发Oracle - 无法捕获更改表的用户信息
问题描述
我试图从任何模式中捕获在 table_name 中触发 [dml-operation] 的用户。在我编写以下代码时尝试这样做时,它捕获了错误的 osuser。
代码
create ore replace trigger trigger_name
after insert on table_name
for each row
declare
v_username varchar2(20);
v_osuser varchar2(20);
begin
select distinct osuser, username into v_osuser, v_username from v$session where osuser in ( select sys_context('USERENV', 'os_user') from dual;
insert into audit_table values (v_osuser, v_username);
end;
/
如何修改此代码以便解决/解决此问题?
注意:我在一台服务器中使用触发器,并从另一台服务器调用。有什么方法可以存储调用服务器的用户信息。目前,它正在从触发器定义的服务器返回用户信息。
谢谢你。
解决方案
使用sys_context('userenv','CURRENT_SCHEMA')
andsys_context('userenv','OS_USER')
获取模式名称/操作系统用户。无需执行任何“选择”或声明任何局部变量
CREATE OR REPLACE TRIGGER trigger_name AFTER
INSERT ON table_name
FOR EACH ROW
BEGIN
INSERT INTO audit_table VALUES (
sys_context(
'userenv','OS_USER'
),
sys_context(
'userenv','CURRENT_SCHEMA'
)
);
END trigger_name;
/
可能值得阅读 sys_context 上的文档
推荐阅读
- inno-setup - 避免重复安装两次的相同安装程序
- c++ - 检查输入 std::array 指针数据是否等于某个常量数组
- sap-fiori - 在 Fiori 中将 smartchart 与 smarttable 连接起来
- powershell - 转换大小写 - 将特定 csv 列中的大写转换为小写
- php - magento 2如何在产品详细信息选项卡中获取产品对象
- php - Laravel API 端点不适用于服务器别名
- azure-data-factory - 将 GetMetaData ChildItems.name 直接插入表中而不使用任何迭代器-Azure 数据工厂
- python - 如何取消分组列表?
- azure - 使用 java 的 Azure 身份验证和授权
- database - Orocommerce 删除实体