Oracle

其他使用者的數據不可見

  • October 6, 2021

我正在使用 Oracle 和 SQL Developer 創建數據庫。我對 SQL 很陌生,所以這可能是一個簡單的問題。我有我的 SYSTEM 使用者,他擁有多個表,例如這個:

CREATE TABLE T_SCHEDULE
(
   sched_id number(4) NOT NULL,
   master_id varchar2(5) REFERENCES T_MASTER(master_id) ON DELETE CASCADE NOT NULL,
   client_id varchar2(5) REFERENCES T_CLIENT(client_id) ON DELETE CASCADE NOT NULL,
   box_num number(5) REFERENCES T_BOX(box_num) ON DELETE CASCADE NOT NULL,
   car_num varchar2(10) REFERENCES T_CAR(car_num) ON DELETE CASCADE NOT NULL,
   price number(7),
   job_start timestamp NOT NULL,
   job_stop timestamp NOT NULL,
   PRIMARY KEY(sched_id)
);
INSERT INTO T_SCHEDULE VALUES (4001, 'M1001', 'C2002', 3002, 'Р232ХВ', 9000, TIMESTAMP '2021-10-02 12:30:00.0', TIMESTAMP '2021-10-02 17:30:00.0');
INSERT INTO T_SCHEDULE VALUES (4002, 'M1002', 'C2003', 3003, 'А847КР', 4000, TIMESTAMP '2021-10-02 08:15:00.0', TIMESTAMP '2021-10-02 12:15:00.0');
INSERT INTO T_SCHEDULE VALUES (4003, 'M1003', 'C2004', 3005, 'С966ЕС', 25000, TIMESTAMP '2021-10-02 10:45:00.0', TIMESTAMP '2021-10-02 13:45:00.0');
INSERT INTO T_SCHEDULE VALUES (4004, 'M1004', 'C2005', 3001, 'Т138УВ', 30000, TIMESTAMP '2021-10-02 10:30:00.0', TIMESTAMP '2021-10-02 15:30:00.0');
INSERT INTO T_SCHEDULE VALUES (4005, 'M1005', 'C2006', 3006, 'Р364ВЕ', 20000, TIMESTAMP '2021-10-02 09:00:00.0', TIMESTAMP '2021-10-02 11:00:00.0');
INSERT INTO T_SCHEDULE VALUES (4006, 'M1001', 'C2007', 3005, 'О117УУ', 24000, TIMESTAMP '2021-10-03 14:10:00.0', TIMESTAMP '2021-10-03 17:10:00.0');
INSERT INTO T_SCHEDULE VALUES (4007, 'M1002', 'C2008', 3002, 'Н439АМ', 6000, TIMESTAMP '2021-10-03 10:40:00.0', TIMESTAMP '2021-10-03 15:40:00.0');
INSERT INTO T_SCHEDULE VALUES (4008, 'M1003', 'C2009', 3003, 'О896МТ', 8000, TIMESTAMP '2021-10-02 14:30:00.0', TIMESTAMP '2021-10-02 18:30:00.0');
INSERT INTO T_SCHEDULE VALUES (4009, 'M1004', 'C2010', 3004, 'Т694КС', 12000, TIMESTAMP '2021-10-03 09:50:00.0', TIMESTAMP '2021-10-03 17:50:00.0');
INSERT INTO T_SCHEDULE VALUES (4010, 'M1005', 'C2001', 3001, 'У601КК', 22000, TIMESTAMP '2021-10-02 16:00:00.0', TIMESTAMP '2021-10-02 20:00:00.0');

我也有具有此權限的使用者 m1001:

GRANT INSERT(sched_id, master_id, client_id, box_num, car_num, job_start, job_stop) 
   ON T_SCHEDULE TO m1001;
GRANT SELECT ON T_SCHEDULE TO m1001;

當我在 m1001 的工作區中插入一行時:

INSERT INTO SYSTEM.T_SCHEDULE 
   (sched_id, master_id, client_id, box_num, car_num, job_start, job_stop) 
VALUES 
   (4011, 'M1001', 'C2001', 3001, 'У601КК', TIMESTAMP '2021-10-04 16:00:00.0', TIMESTAMP '2021-10-04 20:00:00.0');

它是成功的。我現在可以使用選擇查詢來查看它:

SELECT * FROM SYSTEM.T_SCHEDULE;

但是,當我在 SYSTEM 使用者工作區中執行相同的查詢時,我看到了舊版本的表:

為什麼會這樣?如何讓 m1001 的數據可見?

我有我的 SYSTEM 使用者,他擁有幾個表

不要使用數據庫本身附帶的任何預定義使用者名。

不知道Oracle 將來會選擇在那裡做什麼,如果 Oracle 引入一個名為yours的 SYSTEM 擁有的表,那麼您的應用程序數據庫本身都會遇到很多麻煩。

創建你自己的

$$ Tablespace and $$使用者帳戶並將您的表格等放入其中。

當我在 m1001 的工作區中插入一行時……它成功了。我現在可以使用選擇查詢來查看它……但是,當我在 SYSTEM 使用者工作區中執行相同的查詢時,我看到了舊版本的表

神奇的詞是 - 承諾。

Oracle 絕對、完全、明確地不會允許一個使用者讀取另一個使用者所做的未送出的更改。我們在紅木城的朋友已經花費了數百萬來建構一個數據庫架構來保證這一點。

引用自:https://dba.stackexchange.com/questions/300732