[20211206]toad下job建立檢視問題.txt

lfree發表於2021-12-06

[20211206]toad下job建立檢視問題.txt

--//上班檢查發現同事建立的job不是很好,使用sys模式執行,我在測試環境演示遇到一些問題,做一個記錄:

1.環境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//首先我跟蹤一下查詢,在sys使用者下執行如下:
Select job, what, log_user, priv_user, schema_user,
       last_date, this_date, this_sec, next_date,
       next_sec, total_time, broken, interval,
       failures, nls_env
       , instance
from DBA_JOBS
where 1=1
and schema_user = 'SYS'

--//在scott使用者下執行如下:
Select job, what, log_user, priv_user, schema_user,
       last_date, this_date, this_sec, next_date,
       next_sec, total_time, broken, interval,
       failures, nls_env
       , instance
from sys.user_jobs
where 1=1
and schema_user = 'SCOTT';


2.測試:
--//我使用sys使用者登入建立job如下,注我建立2次,一次使用current_schema=SCOTT,一次使用current_schema=SYS.
DECLARE
  X NUMBER;
  user_name varchar2(30);
BEGIN
  select user into user_name from dual;
  execute immediate 'alter session set current_schema = SCOTT';
  BEGIN
    SYS.DBMS_JOB.SUBMIT
    ( job       => X
     ,what      => 'SCOTT.TEST_JOB_DEPTX;'
     ,next_date => to_date('05/12/2021 09:35:55','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'SYSDATE+5/1440 '
     ,no_parse  => FALSE
    );
    SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
    execute immediate 'alter session set current_schema = ' || user_name ;
  EXCEPTION
    WHEN OTHERS THEN
      execute immediate 'alter session set current_schema = ' || user_name ;
      RAISE;
  END;
  COMMIT;
END;
/

--//這樣在toad下使用schema browser瀏覽,兩個介面都無法發現我建立的job。

SCOTT@book> select * from DBA_JOBS where job in (392,393)
  2  @ pr
==============================
JOB                           : 392
LOG_USER                      : SYS
PRIV_USER                     : SYS
SCHEMA_USER                   : SCOTT
LAST_DATE                     : 2021-12-06 09:49:18
LAST_SEC                      : 09:49:18
THIS_DATE                     :
THIS_SEC                      :
NEXT_DATE                     : 2021-12-06 09:54:18
NEXT_SEC                      : 09:54:18
TOTAL_TIME                    : 0
BROKEN                        : N
INTERVAL                      : SYSDATE+5/1440
FAILURES                      : 0
WHAT                          : SCOTT.TEST_JOB_DEPTX;
NLS_ENV                       : NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA' NLS_CURRENCY='$' NLS_ISO_CURRENCY='AMERICA' NLS_NUMERIC_CHARACTERS='.,' NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' NLS_DATE_LANGUAGE='AMERICAN' NLS_SORT='BINARY'
MISC_ENV                      : 010200020A000000
INSTANCE                      : 0
==============================
JOB                           : 393
LOG_USER                      : SYS
PRIV_USER                     : SYS
SCHEMA_USER                   : SCOTT
LAST_DATE                     : 2021-12-06 09:47:18
LAST_SEC                      : 09:47:18
THIS_DATE                     :
THIS_SEC                      :
NEXT_DATE                     : 2021-12-06 09:52:18
NEXT_SEC                      : 09:52:18
TOTAL_TIME                    : 0
BROKEN                        : N
INTERVAL                      : SYSDATE+5/1440
FAILURES                      : 0
WHAT                          : SCOTT.TEST_JOB_DEPTX;
NLS_ENV                       : NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA' NLS_CURRENCY='$' NLS_ISO_CURRENCY='AMERICA' NLS_NUMERIC_CHARACTERS='.,' NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' NLS_DATE_LANGUAGE='AMERICAN' NLS_SORT='BINARY'
MISC_ENV                      : 010200020A000000
INSTANCE                      : 0
PL/SQL procedure successfully completed.
--//上下比較,兩者方式建立並沒有什麼不同。

--//scott使用者在toad下使用sys.user_jobs檢視。

CREATE OR REPLACE FORCE VIEW SYS.USER_JOBS
(
   JOB
  ,LOG_USER
  ,PRIV_USER
  ,SCHEMA_USER
  ,LAST_DATE
  ,LAST_SEC
  ,THIS_DATE
  ,THIS_SEC
  ,NEXT_DATE
  ,NEXT_SEC
  ,TOTAL_TIME
  ,BROKEN
  ,INTERVAL
  ,FAILURES
  ,WHAT
  ,NLS_ENV
  ,MISC_ENV
  ,INSTANCE
)
AS
   SELECT j."JOB"
         ,j."LOG_USER"
         ,j."PRIV_USER"
         ,j."SCHEMA_USER"
         ,j."LAST_DATE"
         ,j."LAST_SEC"
         ,j."THIS_DATE"
         ,j."THIS_SEC"
         ,j."NEXT_DATE"
         ,j."NEXT_SEC"
         ,j."TOTAL_TIME"
         ,j."BROKEN"
         ,j."INTERVAL"
         ,j."FAILURES"
         ,j."WHAT"
         ,j."NLS_ENV"
         ,j."MISC_ENV"
         ,j."INSTANCE"
     FROM dba_jobs j, sys.user$ u
    WHERE j.priv_user = u.name AND u.user# = USERENV ('SCHEMAID');
--//查詢條件除了u.user# = USERENV ('SCHEMAID'),還加了j.priv_user = u.name,導致scoot使用者無法看到job在schema browser瀏覽
--//介面上。

--//而sys使用者查詢DBA_JOBS,但是限定條件是schema_user = 'SYS'。

3.收尾:
--//如何刪除:
SYS@book> @ desc_proc sys dbms_job remove;
INPUT OWNER PACKAGE_NAME OBJECT_NAME
sample : @desc_proc sys dbms_stats gather_%_stats

OWNER      PACKAGE_NAME         OBJECT_NAME                      SEQUENCE ARGUMENT_NAME        DATA_TYPE            IN_OUT    DEFAULTED
---------- -------------------- ------------------------------ ---------- -------------------- -------------------- --------- ----------
SYS        DBMS_JOB             REMOVE                                  1 JOB                  BINARY_INTEGER       IN        N

SYS@book> exec sys.dbms_job.remove(392);
PL/SQL procedure successfully completed.

SYS@book> exec sys.dbms_job.remove(393);
PL/SQL procedure successfully completed.

SYS@book> select * from DBA_JOBS where job in (392,393);
no rows selected

--//實際上這些都是細節問題。實際上如果在sys使用者建立執行如下,就沒有這個問題。
--//注:我的測試環境scott具有dba許可權,執行一樣沒有問題,不過僅僅sys使用者能看到。
DECLARE
  X NUMBER;
  user_name varchar2(30);
BEGIN
  select user into user_name from dual;
  execute immediate 'alter session set current_schema = SYS';
  BEGIN
    SYS.DBMS_JOB.SUBMIT
    ( job       => X
     ,what      => 'SCOTT.TEST_JOB_DEPTX;'
     ,next_date => to_date('05/12/2021 09:35:55','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'SYSDATE+5/1440 '
     ,no_parse  => FALSE
    );
    SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
    execute immediate 'alter session set current_schema = ' || user_name ;
  EXCEPTION
    WHEN OTHERS THEN
      execute immediate 'alter session set current_schema = ' || user_name ;
      RAISE;
  END;
  COMMIT;
END;
/

4.總結:
--//這些僅僅是一些細節問題,我們團隊更多依賴toad檢視,這樣可能出現一些問題。
--//另外我們有一些規定就是這些job建立要經過dba的核審來建立,這樣dba並沒有使用者的許可權,這樣只能以sys使用者建立,這樣建立下只能在
--//sys使用者能看見,我個人認為這樣不是很好。

--//在測試結束前我發現sys使用者還是可以看到就是要設定scott在schema browser。這樣查詢條件是

Select job, what, log_user, priv_user, schema_user,
       last_date, this_date, this_sec, next_date,
       next_sec, total_time, broken, interval,
       failures, nls_env
       , instance
from DBA_JOBS
where 1=1
and schema_user = 'SCOTT';

--//主要區別普通使用者使用user_XXX 檢視,dba使用者是DBA_XXX檢視。順便說一下我們團隊job管理太亂了。

SYS@127.0.0.1:9105/dbcn> select job,log_user,priv_user,schema_user from dba_jobs where priv_user<>'APEX_030200';
       JOB LOG_USER                       PRIV_USER                      SCHEMA_USER
---------- ------------------------------ ------------------------------ ------------------------------
        61 SYSTEM                         SYSTEM                         TOAD
         3 SYSTEM                         SYSTEM                         PPPPPP
        41 SYSTEM                         SYSTEM                         PPPPPP_HHH
       101 SYSTEM                         SYSTEM                         PPPPPP_HHH
       121 SYSTEM                         SYSTEM                         PPPPPP_HHH
        12 SYS                            SYS                            SYS
      5614 SYS                            SYS                            SYS
       342 PPPPPP_HHH                     PPPPPP_HHH                     PPPPPP_HHH
8 rows selected.

--//有好幾個實際上使用system使用者建立。給維護新增不必要的麻煩。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2845881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章