Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在执行前跟踪和修改正在运行的oracle查询?_Oracle_Oracle12c - Fatal编程技术网

如何在执行前跟踪和修改正在运行的oracle查询?

如何在执行前跟踪和修改正在运行的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

我的应用程序正在向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_表的名称,并使用

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

为什么不直接更改应用程序以发送正确的查询?查询是从一个现在不支持的应用程序产品启动的。所以我无法修改它。为什么不直接更改应用程序以发送正确的查询?该查询是从一个现在不受支持的应用程序产品启动的。所以我不能修改它。