ความแตกต่างระหว่างผู้ใช้กับสคีมาใน Oracle คืออะไร
ความแตกต่างระหว่างผู้ใช้กับสคีมาใน Oracle คืออะไร
คำตอบ:
จากAsk Tom
คุณควรพิจารณาถึงสคีมาเป็นบัญชีผู้ใช้และการเก็บรวบรวมวัตถุทั้งหมดในนั้นเป็นสคีมาสำหรับความตั้งใจและวัตถุประสงค์ทั้งหมด
SCOTT เป็นสคีมาที่รวมตาราง EMP, DEPT และ BONUS พร้อมเงินช่วยเหลือต่าง ๆ และอื่น ๆ
SYS เป็นสคีมาที่มีตารางจำนวนมากมุมมองเงินช่วยเหลือ ฯลฯ ฯลฯ
ระบบเป็นสคี .....
ทางเทคนิค - สคีมาคือชุดของเมทาดาทา (พจนานุกรมข้อมูล) ที่ใช้โดยฐานข้อมูลซึ่งโดยทั่วไปจะสร้างโดยใช้ DDL สคีมากำหนดคุณสมบัติของฐานข้อมูลเช่นตารางคอลัมน์และคุณสมบัติ สกีมาฐานข้อมูลคือคำอธิบายของข้อมูลในฐานข้อมูล
ฉันเชื่อว่าปัญหาคือออราเคิลใช้คำว่าสคีมาแตกต่างจากความหมายทั่วไปเล็กน้อย
สคีมาในความหมายที่ 2 นั้นคล้ายกัน แต่ไม่เหมือนกับสคีมาในแง่ที่ 1 เช่นสำหรับแอปพลิเคชันที่ใช้บัญชี DB หลายบัญชีสคีมาในแง่ที่ 2 อาจประกอบด้วย Oracle schemas :-) หลายตัว
สคีมาพลัสยังอาจหมายถึงสิ่งอื่น ๆ ที่ไม่เกี่ยวข้องในบริบทอื่น ๆ (เช่นในวิชาคณิตศาสตร์)
Oracle ควรใช้คำเช่น "userarea" หรือ "accountobjects" แทนที่จะใช้ overloadin "schema" ...
จากWikiAnswers :
นอกจากนี้ผู้ใช้สามารถเข้าถึงวัตถุในสคีมาอื่น ๆ ของตัวเองหากพวกเขาได้รับอนุญาตให้ทำเช่นนั้น
นึกถึงผู้ใช้ตามปกติ (ชื่อผู้ใช้ / รหัสผ่านที่มีการเข้าสู่ระบบและเข้าถึงวัตถุบางอย่างในระบบ) และสคีมาเป็นเวอร์ชันฐานข้อมูลของโฮมไดเร็กตอรี่ของผู้ใช้ โดยทั่วไปผู้ใช้ "foo" จะสร้างสิ่งต่าง ๆ ภายใต้ schema "foo" ตัวอย่างเช่นหากผู้ใช้ "foo" สร้างหรืออ้างถึงตาราง "บาร์" จากนั้น Oracle จะถือว่าผู้ใช้นั้นหมายถึง "foo.bar"
คำตอบนี้ไม่ได้กำหนดความแตกต่างระหว่างเจ้าของและสคีมา แต่ฉันคิดว่ามันเพิ่มการสนทนา
ในโลกแห่งความคิดเล็ก ๆ ของฉัน:
ฉันได้ต่อสู้กับความคิดที่ว่าฉันสร้างจำนวนผู้ใช้ที่ฉันต้องการให้ผู้ใช้แต่ละคน "กิน" (aka, ใช้) schema เดียว
Tim ที่ oracle-base.com แสดงวิธีการทำสิ่งนี้ (มีผู้ใช้จำนวน N คนและผู้ใช้เหล่านี้แต่ละคนจะถูก "เปลี่ยนเส้นทาง" ไปยังสคีมาเดียว
เขามีวิธี "คำพ้อง" ที่สอง (ไม่อยู่ในรายการที่นี่) ฉันแค่อ้างอิงรุ่น CURRENT_SCHEMA (หนึ่งในวิธีการของเขา) ที่นี่:
CURRENT_SCHEMA
เข้าใกล้เมธอดนี้ใช้
CURRENT_SCHEMA
แอ็ตทริบิวต์เซสชันเพื่อชี้ผู้ใช้แอ็พพลิเคชันไปยังสกีมาที่ถูกต้องโดยอัตโนมัติอันดับแรกเราสร้างเจ้าของสคีมาและผู้ใช้แอปพลิเคชัน
CONN sys/password AS SYSDBA -- Remove existing users and roles with the same names. DROP USER schema_owner CASCADE; DROP USER app_user CASCADE; DROP ROLE schema_rw_role; DROP ROLE schema_ro_role; -- Schema owner. CREATE USER schema_owner IDENTIFIED BY password DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON users; GRANT CONNECT, CREATE TABLE TO schema_owner; -- Application user. CREATE USER app_user IDENTIFIED BY password DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp; GRANT CONNECT TO app_user;
ขอให้สังเกตว่าผู้ใช้แอปพลิเคชันสามารถเชื่อมต่อ แต่ไม่มีโควต้าพื้นที่ตารางหรือสิทธิ์ในการสร้างวัตถุ
ต่อไปเราสร้างบทบาทบางอย่างเพื่อให้สามารถอ่านและเขียนได้อย่างเดียว
CREATE ROLE schema_rw_role; CREATE ROLE schema_ro_role;
เราต้องการให้ผู้ใช้แอปพลิเคชันของเราอ่าน - เขียนเข้าถึงวัตถุ schema ดังนั้นเราจึงให้บทบาทที่เกี่ยวข้อง
GRANT schema_rw_role TO app_user;
เราต้องตรวจสอบให้แน่ใจว่าผู้ใช้แอปพลิเคชันมีสคีมาเริ่มต้นซึ่งชี้ไปที่เจ้าของสคีมาดังนั้นเราจึงสร้างทริกเกอร์ AFTER LOGON เพื่อให้เราทำเช่นนี้
CREATE OR REPLACE TRIGGER app_user.after_logon_trg AFTER LOGON ON app_user.SCHEMA BEGIN DBMS_APPLICATION_INFO.set_module(USER, 'Initialized'); EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=SCHEMA_OWNER'; END; /
ตอนนี้เราพร้อมที่จะสร้างวัตถุในเจ้าของสคีมาแล้ว
CONN schema_owner/password CREATE TABLE test_tab ( id NUMBER, description VARCHAR2(50), CONSTRAINT test_tab_pk PRIMARY KEY (id) ); GRANT SELECT ON test_tab TO schema_ro_role; GRANT SELECT, INSERT, UPDATE, DELETE ON test_tab TO schema_rw_role;
แจ้งให้ทราบว่าได้รับสิทธิ์ให้กับบทบาทที่เกี่ยวข้องอย่างไร หากไม่มีสิ่งนี้วัตถุจะไม่ปรากฏแก่ผู้ใช้แอปพลิเคชัน ขณะนี้เรามีเจ้าของสคีมาที่ใช้งานได้และผู้ใช้แอปพลิเคชัน
SQL> CONN app_user/password Connected. SQL> DESC test_tab Name Null? Type ----------------------------------------------------- -------- ------------------------------------ ID NOT NULL NUMBER DESCRIPTION VARCHAR2(50) SQL>
วิธีนี้เหมาะอย่างยิ่งที่ผู้ใช้แอปพลิเคชันเป็นเพียงจุดเริ่มต้นทางเลือกอื่นในสคีมาหลักโดยไม่ต้องการวัตถุของตนเอง
มันง่ายมาก
If USER has OBJECTS
then call it SCHEMA
else
call it USER
end if;
ผู้ใช้อาจได้รับสิทธิ์การเข้าถึงวัตถุ schema ที่เป็นเจ้าของโดยผู้ใช้ที่แตกต่างกัน
สคีมาคือการห่อหุ้มของ DB.objects เกี่ยวกับความคิด / โดเมนของอินทราสต์และเป็นของผู้ใช้ ONE ราย จากนั้นจะถูกแชร์โดยผู้ใช้ / แอปพลิเคชั่นอื่นที่มีบทบาทที่ถูกระงับ ดังนั้นผู้ใช้ไม่จำเป็นต้องเป็นเจ้าของสคีมา แต่สคีมาจำเป็นต้องมีเจ้าของ
บัญชีผู้ใช้เป็นเหมือนญาติที่ถือกุญแจบ้านของคุณ แต่ไม่ได้เป็นเจ้าของอะไรเช่นบัญชีผู้ใช้ไม่มีวัตถุฐานข้อมูลใด ๆ ... ไม่มีพจนานุกรมข้อมูล ...
ในขณะที่ schema คือการห่อหุ้มวัตถุฐานข้อมูล มันเหมือนกับเจ้าของบ้านที่เป็นเจ้าของทุกอย่างในบ้านของคุณและบัญชีผู้ใช้จะสามารถเข้าถึงสินค้าที่บ้านได้ก็ต่อเมื่อเจ้าของเช่น schema ให้เงินช่วยเหลือที่จำเป็นแก่มัน
- ผู้ใช้และ SCHEMA
ทั้งคำที่ผู้ใช้และสคีมานั้นใช้แทนกันได้นั่นคือสาเหตุที่คนส่วนใหญ่สับสนกับคำนี้ด้านล่างฉันอธิบายความแตกต่างระหว่างพวกเขา
- ผู้ใช้เป็นบัญชีเชื่อมต่อฐานข้อมูล (เซิร์ฟเวอร์) เราสามารถสร้างผู้ใช้โดยใช้ CREATE USER user_name ระบุโดยรหัสผ่าน
--Schema
จริงๆแล้วฐานข้อมูล Oracle มีโครงสร้างแบบลอจิคัลและแบบฟิสิคัลเพื่อประมวลผลข้อมูล Schema และโครงสร้างแบบลอจิคัลเพื่อประมวลผลข้อมูลในฐานข้อมูล มันสร้างขึ้นโดยอัตโนมัติโดย oracle เมื่อผู้ใช้สร้างขึ้นมันมีวัตถุทั้งหมดที่สร้างโดยผู้ใช้ที่เชื่อมโยงกับสคีมานั้นตัวอย่างเช่นถ้าฉันสร้างผู้ใช้ที่มีชื่อ santhosh แล้ว oracle สร้างสคีมาที่เรียกว่า santhosh oracle เก็บวัตถุทั้งหมดที่สร้างโดยผู้ใช้ สคี
เราสามารถสร้างสคีมาได้ด้วยคำสั่ง CREATE SCHEMA แต่ Oracle สร้างผู้ใช้สำหรับสคีมานั้นโดยอัตโนมัติ
เราสามารถดร็อปสกีมาโดยใช้คำสั่ง DROP SCHEMA schama_name RESTRICT แต่ไม่สามารถลบ scehema มีวัตถุได้ดังนั้นการวางสคีมาจะต้องว่างเปล่าคำ จำกัด ที่บังคับให้ระบุสคีมาโดยไม่ต้องใช้วัตถุนั้น
หากเราพยายามที่จะวางผู้ใช้มีวัตถุในสคีมาของเขาเราจะต้องระบุคำเรียงซ้อนเพราะ oracle ไม่อนุญาตให้คุณลบผู้ใช้มีวัตถุ DROP USER user_name เรียงซ้อนดังนั้น oracle จะลบวัตถุในสคีมาแล้วปล่อยผู้ใช้โดยอัตโนมัติวัตถุที่อ้างถึงวัตถุสคีมานี้จากสคีมาอื่น ๆ เช่นมุมมองและคำพ้องส่วนตัวจะเข้าสู่สถานะที่ไม่ถูกต้อง
ฉันหวังว่าตอนนี้คุณจะได้รับความแตกต่างระหว่างพวกเขาหากคุณมีข้อสงสัยในหัวข้อนี้โปรดอย่าลังเลที่จะถาม
ขอบคุณ.
ผู้ใช้สคีมาและฐานข้อมูลเหมือนกัน แต่ถ้าสคีมาเป็นเจ้าของวัตถุฐานข้อมูลและผู้ใช้สามารถทำสิ่งใดก็ได้ยกเว้นผู้ใช้ที่เข้าถึงวัตถุพวกเขาไม่สามารถทำการดำเนินการ DDL ใด ๆ จนกว่าผู้ใช้สคีมาจะให้สิทธิ์ที่เหมาะสมแก่คุณ
ตามความรู้เล็กน้อยของฉันเกี่ยวกับ Oracle ... ผู้ใช้และ SCHEMA ค่อนข้างคล้ายกัน แต่ก็มีความแตกต่างที่สำคัญ ผู้ใช้สามารถเรียกว่า SCHEMA หาก "ผู้ใช้" เป็นเจ้าของวัตถุใด ๆ มิฉะนั้น ... มันจะยังคงเป็น "ผู้ใช้" เท่านั้น เมื่อ USER เป็นเจ้าของอย่างน้อยหนึ่งวัตถุจากนั้นตามคำจำกัดความของคุณทั้งหมดข้างต้น .... ผู้ใช้สามารถเรียกได้ว่า SCHEMA
ผู้ใช้: การเข้าถึงทรัพยากรของฐานข้อมูล เหมือนกุญแจเข้าบ้าน
สคีมา: การรวบรวมข้อมูลเกี่ยวกับวัตถุฐานข้อมูล เช่นเดียวกับดัชนีในหนังสือของคุณที่มีข้อมูลสั้น ๆ เกี่ยวกับบท
สำหรับคนส่วนใหญ่ที่คุ้นเคยกับ MariaDB หรือ MySQL สิ่งนี้ดูสับสนเล็กน้อยเพราะใน MariaDB หรือ MySQL พวกเขามี schema ที่แตกต่างกัน (ซึ่งรวมถึงตารางมุมมองที่แตกต่างกันบล็อก PLSQL และวัตถุ DB ฯลฯ ) และ USERS เป็นบัญชีที่สามารถเข้าถึงได้ สคี ดังนั้นจึงไม่มีผู้ใช้รายใดสามารถเป็นสคีมาใด ๆ ได้ ได้รับอนุญาตจะต้องให้กับสคีนั้นแล้วผู้ใช้สามารถเข้าถึงได้ ผู้ใช้และสคีมาจะถูกแยกออกในฐานข้อมูลเช่น MySQL และ MariaDB
ใน Oracle schema และผู้ใช้เกือบจะถือว่าเหมือนกัน ในการทำงานกับสคีมานั้นคุณจำเป็นต้องได้รับอนุญาตซึ่งเป็นที่ที่คุณจะรู้สึกว่าชื่อสคีมานั้นไม่มีอะไรนอกจากชื่อผู้ใช้ สามารถให้สิทธิ์ข้ามสคีมาเพื่อเข้าถึงวัตถุฐานข้อมูลที่แตกต่างจากสคีมาที่แตกต่างกัน ใน oracle เราสามารถพูดได้ว่าผู้ใช้เป็นเจ้าของ schema เพราะเมื่อคุณสร้างผู้ใช้คุณสร้างวัตถุ DB สำหรับมันและในทางกลับกัน
สคีมาเป็นที่เก็บของวัตถุ มันเป็นของผู้ใช้
ฉันอ่านบางที่ว่าถ้าผู้ใช้ฐานข้อมูลของคุณมีสิทธิ์ DDL มันเป็นสคีมามิฉะนั้นมันก็เป็นผู้ใช้