ความแตกต่างระหว่างผู้ใช้กับสคีมาใน Oracle หรือไม่?


314

ความแตกต่างระหว่างผู้ใช้กับสคีมาใน Oracle คืออะไร


17
+1 ฉันสงสัยอยู่เสมอเกี่ยวกับความแตกต่างเช่นกัน: - /
sleske

9
มีบทความที่น่าสนใจด้านล่างซึ่งล้างข้อสงสัยทั้งหมด: http://radiofreetooting.blogspot.com/2007/02/user-schema.html
Sandeep Jindal

9
Oracle schemas เป็นเหมือนโฟลเดอร์ My Documents ใน Windows OS ผู้ใช้สามารถให้สิทธิ์แก่ผู้ใช้รายอื่นเพื่อดูสิ่งต่าง ๆ ในสคีมาของพวกเขา Oracle schema นั้นเป็นพื้นที่ทำงานของผู้ใช้เป็นหลัก
Tarzan

3
นอกจากนี้ยังมีการหารือเกี่ยวกับ DBA: dba.stackexchange.com/questions/37012/...

คำตอบ:


136

จากAsk Tom

คุณควรพิจารณาถึงสคีมาเป็นบัญชีผู้ใช้และการเก็บรวบรวมวัตถุทั้งหมดในนั้นเป็นสคีมาสำหรับความตั้งใจและวัตถุประสงค์ทั้งหมด

SCOTT เป็นสคีมาที่รวมตาราง EMP, DEPT และ BONUS พร้อมเงินช่วยเหลือต่าง ๆ และอื่น ๆ

SYS เป็นสคีมาที่มีตารางจำนวนมากมุมมองเงินช่วยเหลือ ฯลฯ ฯลฯ

ระบบเป็นสคี .....

ทางเทคนิค - สคีมาคือชุดของเมทาดาทา (พจนานุกรมข้อมูล) ที่ใช้โดยฐานข้อมูลซึ่งโดยทั่วไปจะสร้างโดยใช้ DDL สคีมากำหนดคุณสมบัติของฐานข้อมูลเช่นตารางคอลัมน์และคุณสมบัติ สกีมาฐานข้อมูลคือคำอธิบายของข้อมูลในฐานข้อมูล


47
จากหน้าเดียวกัน: สำหรับทุก intents และวัตถุประสงค์เพียงพิจารณา user = schema = user = schema = สิ่งเดียวกัน
sengs

4
แต่ฉันสามารถมีผู้ใช้สองคนที่ใช้สคีมาเดียวกันได้หรือไม่
John John Pichler

6
หากคุณหมายถึง "สามารถวัตถุใน schema เดียวเป็น 'เจ้าของ' โดยผู้ใช้หลายคน" คำตอบคือไม่ถ้าคุณหมายถึง "สามารถวัตถุใน schema เดียวที่ใช้โดยผู้ใช้หลายคน" คำตอบคือใช่แน่นอน
Mahesh

95

ฉันเชื่อว่าปัญหาคือออราเคิลใช้คำว่าสคีมาแตกต่างจากความหมายทั่วไปเล็กน้อย

  1. สคีมาของ Oracle (ตามที่อธิบายไว้ในคำตอบของ Nebakanezer): โดยทั่วไปแล้วเป็นชุดของตารางทั้งหมดและวัตถุอื่น ๆ ที่เป็นเจ้าของโดยบัญชีผู้ใช้ดังนั้นโดยประมาณเทียบเท่ากับบัญชีผู้ใช้
  2. Schema โดยทั่วไป: ชุดของตาราง, sprocs และอื่น ๆ ทั้งหมดที่ประกอบขึ้นเป็นฐานข้อมูลสำหรับระบบ / แอปพลิเคชันที่ระบุ (เช่นใน "นักพัฒนาควรพูดคุยกับ DBA เกี่ยวกับสคีมาสำหรับแอปพลิเคชันใหม่ของเรา")

สคีมาในความหมายที่ 2 นั้นคล้ายกัน แต่ไม่เหมือนกับสคีมาในแง่ที่ 1 เช่นสำหรับแอปพลิเคชันที่ใช้บัญชี DB หลายบัญชีสคีมาในแง่ที่ 2 อาจประกอบด้วย Oracle schemas :-) หลายตัว

สคีมาพลัสยังอาจหมายถึงสิ่งอื่น ๆ ที่ไม่เกี่ยวข้องในบริบทอื่น ๆ (เช่นในวิชาคณิตศาสตร์)

Oracle ควรใช้คำเช่น "userarea" หรือ "accountobjects" แทนที่จะใช้ overloadin "schema" ...


@djangofan Afaik คำถามนี้เกี่ยวกับ Oracle และไม่เกี่ยวกับ MS SQL
peterh - Reinstate Monica

62

จากWikiAnswers :

  • สคีมาคือชุดของวัตถุฐานข้อมูลรวมถึงโครงสร้างตรรกะเช่นตารางมุมมองลำดับขั้นตอนการจัดเก็บคำพ้องดัชนีกลุ่มและลิงค์ฐานข้อมูล
  • ผู้ใช้เป็นเจ้าของสคีมา
  • ผู้ใช้และสคีมามีชื่อเดียวกัน
  • คำสั่ง CREATE USER สร้างผู้ใช้ นอกจากนี้ยังสร้างสคีมาสำหรับผู้ใช้นั้นโดยอัตโนมัติ
  • คำสั่ง CREATE SCHEMA ไม่ได้สร้าง "สคีมา" ตามที่กล่าวไว้มันแค่ให้คุณสร้างหลายตารางและมุมมองและดำเนินการหลายทุนในสคีมาของคุณเองในการทำธุรกรรมเดียว
  • สำหรับเจตนาและวัตถุประสงค์ทั้งหมดคุณสามารถพิจารณาผู้ใช้ว่าเป็นสคีมาและสคีมาที่จะเป็นผู้ใช้

นอกจากนี้ผู้ใช้สามารถเข้าถึงวัตถุในสคีมาอื่น ๆ ของตัวเองหากพวกเขาได้รับอนุญาตให้ทำเช่นนั้น


3
จุดที่ดีอีกครั้งสร้าง SCHEMA - ชื่อที่เลือกไม่ดีสำหรับคำสั่งที่ฉันคิดว่า!
เจฟฟรีย์เคมพ์

4
"คำสั่ง CREATE SCHEMA ไม่ได้สร้าง" schema "ตามที่อธิบาย" ฉันคิดว่า 99% ของความสับสนมาจากสิ่งนี้ และส่วนประโยคนี้จะเคลียร์มันได้ดีมาก ขอบคุณ.
granadaCoder


ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด
hagrawal

50

นึกถึงผู้ใช้ตามปกติ (ชื่อผู้ใช้ / รหัสผ่านที่มีการเข้าสู่ระบบและเข้าถึงวัตถุบางอย่างในระบบ) และสคีมาเป็นเวอร์ชันฐานข้อมูลของโฮมไดเร็กตอรี่ของผู้ใช้ โดยทั่วไปผู้ใช้ "foo" จะสร้างสิ่งต่าง ๆ ภายใต้ schema "foo" ตัวอย่างเช่นหากผู้ใช้ "foo" สร้างหรืออ้างถึงตาราง "บาร์" จากนั้น Oracle จะถือว่าผู้ใช้นั้นหมายถึง "foo.bar"


2
คำอธิบายที่เรียบร้อย แต่ทำไมคุณถึงใช้ "foo" สำหรับทั้งผู้ใช้และสคีมา! พวกเขาจะต้องเหมือนกันหรือไม่
JonnyRaa

ใน Oracle USER เป็นชื่อบัญชี SCHEMA เป็นชุดของวัตถุที่ผู้ใช้เป็นเจ้าของ แม้ว่า Oracle จะสร้างวัตถุ SCHEMA ซึ่งเป็นส่วนหนึ่งของคำสั่ง CREATE USER และ SCHEMA มีชื่อเดียวกันกับ USER แต่พวกเขาจะสังเกตเห็นสิ่งเดียวกัน แน่นอนว่าความสับสนเกิดขึ้นส่วนหนึ่งจากความจริงที่ว่ามีการติดต่อแบบตัวต่อตัวระหว่าง USER และ SCHEMA และสคีมาของผู้ใช้แชร์ชื่อ
Mahesh

17

คำตอบนี้ไม่ได้กำหนดความแตกต่างระหว่างเจ้าของและสคีมา แต่ฉันคิดว่ามันเพิ่มการสนทนา

ในโลกแห่งความคิดเล็ก ๆ ของฉัน:

ฉันได้ต่อสู้กับความคิดที่ว่าฉันสร้างจำนวนผู้ใช้ที่ฉันต้องการให้ผู้ใช้แต่ละคน "กิน" (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>

วิธีนี้เหมาะอย่างยิ่งที่ผู้ใช้แอปพลิเคชันเป็นเพียงจุดเริ่มต้นทางเลือกอื่นในสคีมาหลักโดยไม่ต้องการวัตถุของตนเอง


1
หมายเหตุการใช้บทบาทอาจไม่สามารถแก้ไขปัญหาการอนุญาตสำหรับรหัส PL / SQL การมอบออบเจ็กต์ให้กับบทบาทนั้นไม่ได้เผยแพร่ในลักษณะที่ใช้งานง่ายเมื่อมีการคอมไพล์กระบวนงานที่เก็บไว้ อย่างไรก็ตามฉัน upvote คำตอบนี้เพราะวิธีนี้ดีมาก แต่ก็ไม่ค่อยมีใครรู้จักและไม่ค่อยได้ใช้เท่าที่ฉันจะบอกได้
Andrew Wolfe

15

มันง่ายมาก

If USER has OBJECTS
then call it SCHEMA
else
     call it USER
end if;

ผู้ใช้อาจได้รับสิทธิ์การเข้าถึงวัตถุ schema ที่เป็นเจ้าของโดยผู้ใช้ที่แตกต่างกัน


1
จริงๆแล้วความสับสนจะถูกสร้างขึ้นเมื่อมีคนโทร - ผู้ใช้คือสคีมา ในฐานะผู้ใช้อาจไม่ได้เป็นสคีมาตามที่คุณอธิบาย ผู้ใช้อาจเป็นผู้ใช้ที่เข้าถึงสคีมาของผู้ใช้คนอื่นได้ง่าย
Sandeep Jindal

3

สคีมาคือการห่อหุ้มของ DB.objects เกี่ยวกับความคิด / โดเมนของอินทราสต์และเป็นของผู้ใช้ ONE ราย จากนั้นจะถูกแชร์โดยผู้ใช้ / แอปพลิเคชั่นอื่นที่มีบทบาทที่ถูกระงับ ดังนั้นผู้ใช้ไม่จำเป็นต้องเป็นเจ้าของสคีมา แต่สคีมาจำเป็นต้องมีเจ้าของ


1

บัญชีผู้ใช้เป็นเหมือนญาติที่ถือกุญแจบ้านของคุณ แต่ไม่ได้เป็นเจ้าของอะไรเช่นบัญชีผู้ใช้ไม่มีวัตถุฐานข้อมูลใด ๆ ... ไม่มีพจนานุกรมข้อมูล ...

ในขณะที่ schema คือการห่อหุ้มวัตถุฐานข้อมูล มันเหมือนกับเจ้าของบ้านที่เป็นเจ้าของทุกอย่างในบ้านของคุณและบัญชีผู้ใช้จะสามารถเข้าถึงสินค้าที่บ้านได้ก็ต่อเมื่อเจ้าของเช่น schema ให้เงินช่วยเหลือที่จำเป็นแก่มัน


1

- ผู้ใช้และ 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 จะลบวัตถุในสคีมาแล้วปล่อยผู้ใช้โดยอัตโนมัติวัตถุที่อ้างถึงวัตถุสคีมานี้จากสคีมาอื่น ๆ เช่นมุมมองและคำพ้องส่วนตัวจะเข้าสู่สถานะที่ไม่ถูกต้อง

ฉันหวังว่าตอนนี้คุณจะได้รับความแตกต่างระหว่างพวกเขาหากคุณมีข้อสงสัยในหัวข้อนี้โปรดอย่าลังเลที่จะถาม

ขอบคุณ.


0

ผู้ใช้สคีมาและฐานข้อมูลเหมือนกัน แต่ถ้าสคีมาเป็นเจ้าของวัตถุฐานข้อมูลและผู้ใช้สามารถทำสิ่งใดก็ได้ยกเว้นผู้ใช้ที่เข้าถึงวัตถุพวกเขาไม่สามารถทำการดำเนินการ DDL ใด ๆ จนกว่าผู้ใช้สคีมาจะให้สิทธิ์ที่เหมาะสมแก่คุณ


0

ตามความรู้เล็กน้อยของฉันเกี่ยวกับ Oracle ... ผู้ใช้และ SCHEMA ค่อนข้างคล้ายกัน แต่ก็มีความแตกต่างที่สำคัญ ผู้ใช้สามารถเรียกว่า SCHEMA หาก "ผู้ใช้" เป็นเจ้าของวัตถุใด ๆ มิฉะนั้น ... มันจะยังคงเป็น "ผู้ใช้" เท่านั้น เมื่อ USER เป็นเจ้าของอย่างน้อยหนึ่งวัตถุจากนั้นตามคำจำกัดความของคุณทั้งหมดข้างต้น .... ผู้ใช้สามารถเรียกได้ว่า SCHEMA


0

ผู้ใช้: การเข้าถึงทรัพยากรของฐานข้อมูล เหมือนกุญแจเข้าบ้าน

สคีมา: การรวบรวมข้อมูลเกี่ยวกับวัตถุฐานข้อมูล เช่นเดียวกับดัชนีในหนังสือของคุณที่มีข้อมูลสั้น ๆ เกี่ยวกับบท

ดูที่นี่สำหรับรายละเอียด


0

สำหรับคนส่วนใหญ่ที่คุ้นเคยกับ MariaDB หรือ MySQL สิ่งนี้ดูสับสนเล็กน้อยเพราะใน MariaDB หรือ MySQL พวกเขามี schema ที่แตกต่างกัน (ซึ่งรวมถึงตารางมุมมองที่แตกต่างกันบล็อก PLSQL และวัตถุ DB ฯลฯ ) และ USERS เป็นบัญชีที่สามารถเข้าถึงได้ สคี ดังนั้นจึงไม่มีผู้ใช้รายใดสามารถเป็นสคีมาใด ๆ ได้ ได้รับอนุญาตจะต้องให้กับสคีนั้นแล้วผู้ใช้สามารถเข้าถึงได้ ผู้ใช้และสคีมาจะถูกแยกออกในฐานข้อมูลเช่น MySQL และ MariaDB

ใน Oracle schema และผู้ใช้เกือบจะถือว่าเหมือนกัน ในการทำงานกับสคีมานั้นคุณจำเป็นต้องได้รับอนุญาตซึ่งเป็นที่ที่คุณจะรู้สึกว่าชื่อสคีมานั้นไม่มีอะไรนอกจากชื่อผู้ใช้ สามารถให้สิทธิ์ข้ามสคีมาเพื่อเข้าถึงวัตถุฐานข้อมูลที่แตกต่างจากสคีมาที่แตกต่างกัน ใน oracle เราสามารถพูดได้ว่าผู้ใช้เป็นเจ้าของ schema เพราะเมื่อคุณสร้างผู้ใช้คุณสร้างวัตถุ DB สำหรับมันและในทางกลับกัน


-1

สคีมาเป็นที่เก็บของวัตถุ มันเป็นของผู้ใช้


1
นั่นหมายความว่าผู้ใช้สามารถเป็นเจ้าของหลายสกีมา ฉันไม่เชื่อว่าเป็นไปได้ (ใน Oracle); ในขณะที่ผู้ใช้Aอาจมีสิทธิ์แบบเต็มของผู้ดูแลระบบเหนือผู้ใช้Bจะเป็นเจ้าของหลังBแม้ว่าจะไม่มีใครลงชื่อเข้าใช้ด้วยชื่อผู้ใช้ดังกล่าว

-1

ฉันอ่านบางที่ว่าถ้าผู้ใช้ฐานข้อมูลของคุณมีสิทธิ์ DDL มันเป็นสคีมามิฉะนั้นมันก็เป็นผู้ใช้


นี่คือความแตกต่างที่มีประโยชน์จริง ๆ - ผู้ใช้ที่มี CREATE privs แตกต่างจากผู้ที่ไม่มี private ที่สร้างขึ้น
Andrew Wolfe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.