Oracle'da bir kullanıcı ve bir şema arasındaki fark nedir?


314

Oracle'da bir kullanıcı ile bir şema arasındaki fark nedir?


17
+1 Ayrımı hep merak ettim: - /.
sleske

9
Aşağıda tüm şüpheleri gideren ilginç bir makale var: http://radiofreetooting.blogspot.com/2007/02/user-schema.html
Sandeep Jindal

9
Oracle şemaları, Windows işletim sistemindeki Belgelerim klasörleri gibidir. Bir kullanıcı, şemalarındaki şeyleri görmek için diğer kullanıcılara izin verebilir. Oracle şeması aslında bir kullanıcının çalışma alanıdır.
Tarzan

Yanıtlar:


136

Gönderen Tom sor

Bir şemayı, kullanıcı hesabı ve buradaki tüm nesnelerin toplanması, tüm amaç ve amaçlar için bir şema olarak düşünmelisiniz.

SCOTT, çeşitli hibelerle EMP, DEPT ve BONUS tablolarını ve diğer şeyleri içeren bir şemadır.

SYS, tonlarca tablo, görünüm, hibe vb. İçeren bir şemadır.

SİSTEM bir şemadır .....

Teknik olarak - Şema, veritabanı tarafından kullanılan ve genellikle DDL kullanılarak oluşturulan meta veri kümesidir (veri sözlüğü). Şema, veritabanının tablolar, sütunlar ve özellikler gibi niteliklerini tanımlar. Veritabanı şeması, veritabanındaki verilerin açıklamasıdır.


47
Aynı sayfadan: tüm niyet ve amaçlar için, user = schema = user = schema = aynı şeyi düşünün.
sengs

4
Ancak aynı şemayı kullanan iki kullanıcım olabilir mi?
John John Pichler

6
Şunu Eğer "tek şemada nesneler birden fazla kullanıcı tarafından kullanılabilir" cevabı evet kesinlikle demek ise cevap sayılı olduğunu "tek şemada nesneler birden fazla kullanıcı tarafından 'ait' olabilir"
Mahesh

95

Sorun, Oracle'ın şema terimini genel olarak ne anlama geldiğinden biraz farklı kullandığına inanıyorum .

  1. Oracle'ın şeması (Nebakanezer'in cevabında açıklandığı gibi): temel olarak bir kullanıcı hesabına ait olan tüm tabloların ve diğer nesnelerin kümesi, kabaca bir kullanıcı hesabına eşdeğerdir
  2. Şema genel olarak: Belirli bir sistem / uygulama için veritabanını oluşturan tüm tablolar, sprocs vb. ("Geliştiriciler yeni uygulamamızın şeması hakkında DBA'lar ile tartışmalıdır." Bölümünde olduğu gibi)

2. anlamda şema benzerdir, ancak 1. anlamda şema ile aynı değildir. Örneğin, birkaç DB hesabı kullanan bir uygulama için, 2. anlamda bir şema birkaç Oracle şemasından oluşabilir :-).

Ayrıca şema , diğer bağlamlarda (örn. Matematikte) bir sürü başka, ilgisiz şey anlamına da gelebilir.

Oracle, "şema" ya aşırı yüklenmek yerine "userarea" ya da "accountobjects" gibi bir terim kullanmış olmalı ...


@djangofan Afaik Bu soru MS SQL hakkında değil Oracle hakkındadır.
peterh - Monica adlı kişiyi geri yükle

62

Gönderen WikiAnswers :

  • Şema, tablolar, görünümler, diziler, saklı yordamlar, eşanlamlılar, dizinler, kümeler ve veritabanı bağlantıları gibi mantıksal yapıları içeren veritabanı nesnelerinin toplanmasıdır.
  • Bir kullanıcının bir şeması vardır.
  • Bir kullanıcı ve bir şema aynı ada sahiptir.
  • CREATE USER komutu bir kullanıcı oluşturur. Ayrıca bu kullanıcı için otomatik olarak bir şema oluşturur.
  • CREATE SCHEMA komutu, ima ettiği gibi bir "şema" oluşturmaz, yalnızca birden çok tablo ve görünüm oluşturmanıza ve tek bir işlemde kendi şemanızda birden çok bağış gerçekleştirmenize olanak tanır.
  • Tüm niyet ve amaçlar için, bir kullanıcıyı şema, şema da kullanıcı olarak düşünebilirsiniz.

Ayrıca, bir kullanıcı izinleri varsa kendi şemalarındaki nesnelere erişebilir.


3
iyi nokta yeniden ŞEMA OLUŞTUR - komut için kötü seçilmiş bir isim düşünürdüm!
Jeffrey Kemp

4
Msgstr "CREATE SCHEMA komutu ima ettiği gibi bir" şema "oluşturmuyor". Sanırım karışıklığın% 99'u bundan geliyor. Ve bu cümle parçası onu çok iyi temizler. Teşekkür ederim.
granadaCoder


Bunun en iyi cevap olduğunu düşünüyorum.
hagrawal

50

Bir kullanıcıyı normalde yaptığınız gibi (sistemde oturum açmak ve sistemdeki bazı nesnelere erişime sahip kullanıcı adı / parola) ve şemayı kullanıcının ana dizininin veritabanı sürümü olarak düşünün. "Foo" kullanıcısı genellikle "foo" şeması altında bir şeyler oluşturur, örneğin "foo" kullanıcısı "bar" tablosunu oluşturuyor veya bu tabloya başvuruyorsa Oracle, kullanıcının "foo.bar" anlamına geldiğini varsayacaktır.


2
temiz açıklama ama neden hem kullanıcı hem de şema için "foo" kullandınız ?! Aynı olmaları gerekiyor mu?
JonnyRaa

Oracle'da USER hesap adı, SCHEMA bu kullanıcının sahip olduğu nesne kümesidir. Oracle, SCHEMA nesnesini CREATE USER deyiminin bir parçası olarak oluştursa da SCHEMA, USER ile aynı ada sahiptir, ancak aynı şeyi not ederler. Tabii ki, karışıklık kısmen USER ve SCHEMA arasında bire bir yazışma olması ve bir kullanıcının şemasının adını paylaşması gerçeğinden kaynaklanmaktadır.
Mahesh

17

Bu cevap, bir sahip ve şema arasındaki farkı tanımlamıyor, ancak tartışmaya katkıda bulunduğunu düşünüyorum.

Benim küçük dünyamda:

Bu kullanıcıların her birinin tek bir şemayı "tüketmesini" (yani, kullanmasını) istediğim N sayıda kullanıcı oluşturduğum düşüncesi ile mücadele ettim.

Oracle-base.com'da Tim bunun nasıl yapılacağını gösterir (N kullanıcı sayısı vardır ve bu kullanıcıların her biri tek bir şemaya "yeniden yönlendirilecektir".

İkinci bir "eş anlamlı" yaklaşımı vardır (burada listelenmemiştir). Burada sadece CURRENT_SCHEMA sürümünü (yaklaşımlarından biri) alıntı yapıyorum:

CURRENT_SCHEMA Yaklaşmak

Bu yöntem, CURRENT_SCHEMAuygulama kullanıcılarını otomatik olarak doğru şemaya yönlendirmek için session özniteliğini kullanır .

İlk olarak, şema sahibini ve bir uygulama kullanıcısını yaratırız.

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;

Uygulama kullanıcısının bağlanabildiğine, ancak nesne oluşturmak için herhangi bir tablo alanı kotasına veya ayrıcalığına sahip olmadığına dikkat edin.

Ardından, okuma-yazma ve salt okunur erişime izin vermek için bazı roller oluşturuyoruz.

CREATE ROLE schema_rw_role;
CREATE ROLE schema_ro_role;

Uygulama kullanıcısına şema nesnelerine okuma-yazma erişimi vermek istiyoruz, bu nedenle ilgili rolü veriyoruz.

GRANT schema_rw_role TO app_user;

Uygulama kullanıcısının varsayılan şemasının şema sahibine işaret ettiğinden emin olmamız gerekir, bu nedenle bunu bizim için yapmak için AFTER LOGON tetikleyici oluştururuz.

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;
/

Şimdi şema sahibinde bir nesne oluşturmaya hazırız.

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;

Ayrıcalıkların ilgili rollere nasıl verildiğine dikkat edin. Bu olmadan, nesneler uygulama kullanıcısı tarafından görülemez. Artık çalışan bir şema sahibimiz ve uygulama kullanıcısı var.

SQL> CONN app_user/password
Connected.
SQL> DESC test_tab
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER
 DESCRIPTION                                                    VARCHAR2(50)

SQL>

Bu yöntem, uygulama kullanıcısının ana şemaya basit bir alternatif giriş noktası olması ve kendi nesnesi gerektirmediği durumlarda idealdir.


1
Rol kullanımının PL / SQL kodu için izin sorunlarını çözemeyebileceğini unutmayın. Depolanan prosedürler derlendiğinde, rollere nesne hibeleri sezgisel bir şekilde yayılmaz. Bununla birlikte, bu cevabı iptal ettim çünkü bu yaklaşım gerçekten harika, ama çok az biliniyor ve söyleyebildiğim kadar nadiren kullanılıyor.
Andrew Wolfe

15

Çok basit.

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

Bir kullanıcıya farklı Kullanıcılara ait şema nesnelerine erişim izni verilebilir.


1
Aslında karışıklık insanlar aradığında oluşturulur - Kullanıcı Şema. Kullanıcı açıkladığınız gibi şema olmayabilir. Bir kullanıcı, basitçe başka bir Kullanıcının Şemasına erişen bir kullanıcı olabilir.
Sandeep Jindal

3

Şema, bir fikir / etki alanı hakkında DB.objects'in kapsüllenmesidir ve bir kullanıcıya aittir. Daha sonra, bastırılmış rolleri olan diğer kullanıcılar / uygulamalar tarafından paylaşılacaktır. Bu nedenle kullanıcıların bir şemaya sahip olması gerekmez, ancak şemanın bir sahibi olması gerekir.


1

Bir kullanıcı hesabı, evinizin anahtarını tutan ancak hiçbir şeye sahip olmayan akrabalar gibidir, yani bir kullanıcı hesabının herhangi bir veritabanı nesnesi yok ... veri sözlüğü yok ...

Oysa bir şema veritabanı nesnelerinin kapsüllenmesidir. Evinizdeki her şeye sahip olan evin sahibi gibi ve bir kullanıcı hesabı evde mallara sadece sahibi yani şema gerekli hibeleri verdiğinde erişebilecektir.


1

--KULLANICI ve ŞEMA

Her iki kelime ve şema birbirinin yerine kullanılabilir, bu yüzden çoğu insan aşağıdaki bu kelimeler hakkında kafa karışıklığına neden oluyor

- Kullanıcı Kullanıcı veritabanı (Sunucu) bağlamak için bir hesaptır. CREATE USER kullanıcı_adı IDENTIFIED BY parolasını kullanarak kullanıcı oluşturabiliriz.

--Şema

Aslında Oracle Database, verileri işlemek için mantıksal ve fiziksel bir yapı içerir. Kullanıcı oluşturulduğunda oracle tarafından otomatik olarak oluşturulur. O şema ile ilişkili kullanıcı tarafından oluşturulan tüm nesneleri içerir. Örneğin santhosh adında bir kullanıcı oluşturduysam oracle santhosh adlı bir şema oluşturur, oracle santhosh kullanıcı santhosh tarafından oluşturulan tüm nesneleri depolar şema.

CREATE SCHEMA deyimiyle şema oluşturabiliriz, ancak Oracle Bu şema için otomatik olarak bir kullanıcı oluşturur.

DROP SCHEMA schama_name RESTRICT deyimini kullanarak şemayı Bırakabiliriz, ancak scehema nesneleri içerir, bu nedenle şemayı bırakmak için boş olmalıdır. Kısıtlama sözcüğü, şemayı dışarıdaki nesnelerle önceden belirtin.

Şemasında bir kullanıcı içeren nesneler bırakmaya çalışırsak, oracle kullanıcı içeren nesneleri silmenize izin vermediğinden CASCADE kelimesini belirtmeliyiz. DROP USER kullanıcı_adı CASCADE, böylece oracle şemadaki nesneleri siler ve daha sonra kullanıcıyı otomatik olarak düşürür, görünümler ve özel eşanlamlılar gibi diğer şemalardan bu şema nesnelerine atıfta bulunulan nesneler geçersiz duruma geçer.

Umarım şimdi aralarında bir fark vardır, bu konuda herhangi bir şüpheniz varsa, lütfen sormaya çekinmeyin.

Teşekkür ederim.


0

Bir şema ve veritabanı kullanıcıları aynıdır, ancak şema veritabanı nesnelerine sahipse ve nesnelerinin her şeyi yapabiliyor ancak kullanıcı nesnelere erişebiliyorsa, şema kullanıcısı size uygun ayrıcalıkları verene kadar herhangi bir DDL işlemi yapamazlar.


0

Oracle hakkındaki küçük bilgilerime dayanarak ... bir KULLANICI ve bir SCHEMA biraz benzer. Ama aynı zamanda büyük bir fark var. "KULLANICI" herhangi bir nesneye sahipse, KULLANICI SCHEMA olarak adlandırılabilir, aksi takdirde ... yalnızca "KULLANICI" olarak kalır. KULLANICI en az bir nesneye sahip olduktan sonra yukarıdaki tüm tanımlarınız sayesinde .... KULLANICI artık SCHEMA olarak adlandırılabilir.



0

MariaDB veya MySQL'e daha aşina olan çoğu insan için bu biraz kafa karıştırıcı görünüyor çünkü MariaDB veya MySQL'de farklı şemalara sahipler (farklı tablolar, görünüm, PLSQL blokları ve DB nesneleri vb.) Ve KULLANICILAR bunlara erişebilen hesaplardır şema. Bu nedenle, belirli bir kullanıcı belirli bir şemaya ait olamaz. Bu Şemaya izin verilmelidir, daha sonra kullanıcı buna erişebilir. Kullanıcılar ve Şema, MySQL ve MariaDB gibi veritabanlarında ayrılır.

Oracle şemasında ve kullanıcılara neredeyse aynı muamele edilir. Bu şema ile çalışmak için, şema adının kullanıcı adından başka bir şey olmadığını hissedeceğiniz izne sahip olmanız gerekir. Şemalar arasında, farklı şemadaki farklı veritabanı nesnelerine erişmek için izin verilebilir. Oracle içinde bir kullanıcının bir şemaya sahip olduğunu söyleyebiliriz çünkü bir kullanıcı oluşturduğunuzda bunun için DB nesneleri yaratırsınız ve bunun tersi de geçerlidir.


-1

Şema bir nesne kabıdır. Bir kullanıcıya aittir.


1
Bu, bir kullanıcının birden fazla şemaya sahip olabileceği anlamına gelir. Bunun mümkün olduğuna inanmıyorum (Oracle'da); kullanıcı Aşema üzerinde tam yönetici haklarına sahip olsa da, hiç kimse böyle bir kullanıcı adıyla oturum açmasa bile B, ikincisi her zaman kullanıcıya aittirB .

-1

Eh, bir yerde veritabanı kullanıcı DDL ayrıcalıkları varsa o zaman bu bir şema, başka bir kullanıcı okudum.


Bu gerçekten yararlı bir ayrımdır - CREATE özelliğine sahip olmayan kullanıcılar, CREATE özelliğine sahip olmayanlardan farklıdır
Andrew Wolfe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.