如何在执行前跟踪和修改正在运行的oracle查询?
我的应用程序正在向Oracle发送以下查询 选择*FROM EMPLOYEE WHERE DATE>SYSDATE-1 order by EMPLOYEE\u id 我无法从应用程序更改此查询。我正在寻找一种oracle监视查询的方法,将其更改为下面的查询格式并返回结果 选择*FROM EMPLOYEE WHERE DATE>SYSDATE-1,当前_EMPLOYEE='YES'按员工id排序 多谢各位。如何在执行前跟踪和修改正在运行的oracle查询?,oracle,oracle12c,Oracle,Oracle12c,我的应用程序正在向Oracle发送以下查询 选择*FROM EMPLOYEE WHERE DATE>SYSDATE-1 order by EMPLOYEE\u id 我无法从应用程序更改此查询。我正在寻找一种oracle监视查询的方法,将其更改为下面的查询格式并返回结果 选择*FROM EMPLOYEE WHERE DATE>SYSDATE-1,当前_EMPLOYEE='YES'按员工id排序 多谢各位。 Subrat您可能需要将employee表重命名为类似EMP_表的名称,并使用 creat
Subrat您可能需要将employee表重命名为类似EMP_表的名称,并使用
create view employee as select * from emp_table where currently_employed = 'YES';
在live上实现之前,请针对测试实例对其进行测试您可能需要将employee表重命名为类似EMP_表的名称,并使用
create view employee as select * from emp_table where currently_employed = 'YES';
在live上实现之前,请针对测试实例对其进行测试如果应用程序可以作为不同的用户(而不是表所有者)连接到数据库,则还可以实现虚拟专用数据库策略以在运行中修改查询。请看这里: 如果应用程序作为单独的用户连接,还可以按照@ekochergin的建议创建一个视图,并让应用程序的用户模式中的同义词EMPLOYEE指向数据所有者模式中的视图
如果应用程序以数据所有者的身份连接,那么您的选项将非常有限。重命名表并按建议用视图替换它是最简单的选择。如果您有大量资金投资于Oracle的数据库应用程序防火墙设备,您还可以使用安全策略在运行中修改查询。如果应用程序可以作为不同的用户(而不是表所有者)连接到数据库,您还可以实施虚拟专用数据库策略来在运行中修改查询。请看这里: 如果应用程序作为单独的用户连接,还可以按照@ekochergin的建议创建一个视图,并让应用程序的用户模式中的同义词EMPLOYEE指向数据所有者模式中的视图
如果应用程序以数据所有者的身份连接,那么您的选项将非常有限。重命名表并按建议用视图替换它是最简单的选择。如果您有大量资金投资于Oracle的数据库应用程序防火墙设备,您还可以在运行中使用安全策略修改查询。如果您只需要转换少量语句,请使用SQL转换框架。如果需要修改许多语句,那么应该查看其他答案中描述的选项,例如虚拟专用数据库、视图或同义词 对于此示例架构:
create table employee
(
employee_id number,
hire_date date,
currently_employed varchar2(3)
);
insert into employee values(1, sysdate, 'NO');
insert into employee values(1, sysdate, 'YES');
commit;
创建以下转换器配置文件,然后创建特定的翻译:
begin
dbms_sql_translator.create_profile('EMPLOYEE_TRANSLATOR_PROFILE');
dbms_sql_translator.register_sql_translation
(
profile_name => 'EMPLOYEE_TRANSLATOR_PROFILE',
sql_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id]',
translated_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) and Currently_employed = 'YES' order by employee_id]'
);
end;
/
--Logon trigger that enables profiles.
--I'm not sure why, but you must create this trigger as SYS.
create or replace trigger sys.logon_trg
after logon on database
--Add your username here:
when (user in ('JHELLER'))
begin
execute immediate 'alter session set sql_translation_profile = jheller.employee_translator_profile';
execute immediate q'[alter session set events = '10601 trace name context forever, level 32']';
end;
/
必须在每个会话中启用翻译配置文件。由于您无法控制应用程序,因此可以创建登录配置文件,该配置文件将自动运行命令以启用转换:
begin
dbms_sql_translator.create_profile('EMPLOYEE_TRANSLATOR_PROFILE');
dbms_sql_translator.register_sql_translation
(
profile_name => 'EMPLOYEE_TRANSLATOR_PROFILE',
sql_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id]',
translated_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) and Currently_employed = 'YES' order by employee_id]'
);
end;
/
--Logon trigger that enables profiles.
--I'm not sure why, but you must create this trigger as SYS.
create or replace trigger sys.logon_trg
after logon on database
--Add your username here:
when (user in ('JHELLER'))
begin
execute immediate 'alter session set sql_translation_profile = jheller.employee_translator_profile';
execute immediate q'[alter session set events = '10601 trace name context forever, level 32']';
end;
/
现在,当应用程序运行通常返回两行的原始查询时,它将运行仅返回一行的第二个查询:
SQL> SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id;
EMPLOYEE_ID HIRE_DATE CUR
----------- --------- ---
1 12-FEB-21 YES
但是要小心微小的语法变化,这将阻止翻译。例如,如果SELECT更改为SELECT,则查询将不会被替换,并将再次返回两行:
SQL> select * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id;
EMPLOYEE_ID HIRE_DATE CUR
----------- --------- ---
1 12-FEB-21 YES
1 12-FEB-21 NO
如果只需要转换少量语句,请使用SQL转换框架。如果需要修改许多语句,那么应该查看其他答案中描述的选项,例如虚拟专用数据库、视图或同义词 对于此示例架构:
create table employee
(
employee_id number,
hire_date date,
currently_employed varchar2(3)
);
insert into employee values(1, sysdate, 'NO');
insert into employee values(1, sysdate, 'YES');
commit;
创建以下转换器配置文件,然后创建特定的翻译:
begin
dbms_sql_translator.create_profile('EMPLOYEE_TRANSLATOR_PROFILE');
dbms_sql_translator.register_sql_translation
(
profile_name => 'EMPLOYEE_TRANSLATOR_PROFILE',
sql_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id]',
translated_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) and Currently_employed = 'YES' order by employee_id]'
);
end;
/
--Logon trigger that enables profiles.
--I'm not sure why, but you must create this trigger as SYS.
create or replace trigger sys.logon_trg
after logon on database
--Add your username here:
when (user in ('JHELLER'))
begin
execute immediate 'alter session set sql_translation_profile = jheller.employee_translator_profile';
execute immediate q'[alter session set events = '10601 trace name context forever, level 32']';
end;
/
必须在每个会话中启用翻译配置文件。由于您无法控制应用程序,因此可以创建登录配置文件,该配置文件将自动运行命令以启用转换:
begin
dbms_sql_translator.create_profile('EMPLOYEE_TRANSLATOR_PROFILE');
dbms_sql_translator.register_sql_translation
(
profile_name => 'EMPLOYEE_TRANSLATOR_PROFILE',
sql_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id]',
translated_text => q'[SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) and Currently_employed = 'YES' order by employee_id]'
);
end;
/
--Logon trigger that enables profiles.
--I'm not sure why, but you must create this trigger as SYS.
create or replace trigger sys.logon_trg
after logon on database
--Add your username here:
when (user in ('JHELLER'))
begin
execute immediate 'alter session set sql_translation_profile = jheller.employee_translator_profile';
execute immediate q'[alter session set events = '10601 trace name context forever, level 32']';
end;
/
现在,当应用程序运行通常返回两行的原始查询时,它将运行仅返回一行的第二个查询:
SQL> SELECT * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id;
EMPLOYEE_ID HIRE_DATE CUR
----------- --------- ---
1 12-FEB-21 YES
但是要小心微小的语法变化,这将阻止翻译。例如,如果SELECT更改为SELECT,则查询将不会被替换,并将再次返回两行:
SQL> select * FROM EMPLOYEE WHERE HIRE_DATE > (SYSDATE - 1) order by employee_id;
EMPLOYEE_ID HIRE_DATE CUR
----------- --------- ---
1 12-FEB-21 YES
1 12-FEB-21 NO
为什么不直接更改应用程序以发送正确的查询?查询是从一个现在不支持的应用程序产品启动的。所以我无法修改它。为什么不直接更改应用程序以发送正确的查询?该查询是从一个现在不受支持的应用程序产品启动的。所以我不能修改它。