如何在Oracle数据库11g中创建新架构/新用户?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我已经申请在一家公司实习,并且他们要求我为他们的公司创建一个具有特定要求的模式,并将它们发送给DDL文件。我已经安装了Oracle数据库11g Express版本,但是如何在Oracle数据库11g中创建新的模式?我在网上搜索了一个解决方案,但可以理解要做什么。创建一个模式后,我应该将它发送给哪个文件?

提问于
用户回答回答于

让我们开始吧。你对Oracle有什么了解吗?

首先你需要了解SCHEMA是什么。模式是数据或模式对象的逻辑结构的集合。模式由数据库用户拥有,并且与该用户具有相同的名称。每个用户拥有一个模式。模式对象可以使用SQL创建和操作。

  1. CREATE USER acoder; - 无论何时在Oracle中创建新用户,都会创建一个与用户名同名的模式,其中存储了所有对象。
  2. 授予acoder创建会话; - 没有做到这一点,你什么都做不了。

要访问另一个用户的模式,需要为该模式上的特定对象授予权限,或者可以选择分配SYSDBA角色。

用户回答回答于

一般来说,oracle中的模式与用户相同。Oracle数据库在您创建用户时自动创建一个模式。具有DDL文件扩展名的文件是一个SQL数据定义语言文件。

创建新用户(使用SQL Plus)

基本的SQL Plus命令:

  - connect: connects to a database
  - disconnect: logs off but does not exit
  - exit: exists

打开SQL Plus并记录:

/ as sysdba

sysdba是一个角色,就像unix上的“root”或Windows上的“Administrator”。它看到了所有,都可以做到。在内部,如果以sysdba身份连接,模式名称将显示为SYS。

创建一个用户:

SQL> create user johny identified by 1234;

查看所有用户并检查用户johny是否存在:

SQL> select username from dba_users;

如果您尝试以johny身份登录,您会收到错误消息:

ERROR:
ORA-01045: user JOHNY lacks CREATE SESSION privilege; logon denied

要登录的用户至少需要创建会话特权,所以我们必须将此特权授予用户:

SQL> grant create session to johny;

现在,您可以以用户johny的身份进行连接:

username: johny
password: 1234

为了摆脱用户,你可以删除它:

SQL> drop user johny;

这是显示如何创建用户的基本示例。它可能更复杂。上面我们创建了一个用户,其对象存储在数据库的默认表空间中。要使数据库整洁,我们应该将用户对象放置到自己的空间(表空间是数据库中可以包含模式对象的空间分配)。

显示已创建的表空间:

SQL> select tablespace_name from dba_tablespaces;

创建表空间:

SQL> create tablespace johny_tabspace
  2  datafile 'johny_tabspace.dat'
  3  size 10M autoextend on;

创建临时表空间(Temporaty表空间是数据库中的一个空间分配,它可以包含仅在会话期间持续存在的瞬态数据。在处理或实例失败后,此瞬态数据无法恢复):

SQL> create temporary tablespace johny_tabspace_temp
  2  tempfile 'johny_tabspace_temp.dat'
  3  size 5M autoextend on;

创建用户:

SQL> create user johny
  2  identified by 1234
  3  default tablespace johny_tabspace
  4  temporary tablespace johny_tabspace_temp;

授予一些特权:

SQL> grant create session to johny;
SQL> grant create table to johny;
SQL> grant unlimited tablespace to johny;

以johny身份登录并检查他具有的特权:

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE

通过创建表特权,用户可以创建表:

SQL> create table johny_table
  2  (
  3     id int not null,
  4     text varchar2(1000),
  5     primary key (id)
  6  );

插入数据:

SQL> insert into johny_table (id, text)
  2  values (1, 'This is some text.');

选择:

SQL> select * from johny_table;

ID  TEXT
--------------------------
1   This is some text.

要获取DDL数据,你可以使用DBMS_METADATA包,它“为您提供了一种方法来从数据库字典中检索元数据作为XML或创建DDL,并提交XML以重新创建该对象。”

对于表格:

SQL> set pagesize 0
SQL> set long 90000
SQL> set feedback off
SQL> set echo off
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;

结果:

  CREATE TABLE "JOHNY"."JOHNY_TABLE"
   (    "ID" NUMBER(*,0) NOT NULL ENABLE,
        "TEXT" VARCHAR2(1000),
         PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "JOHNY_TABSPACE"  ENABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "JOHNY_TABSPACE"

索引:

SQL> set pagesize 0
SQL> set long 90000
SQL> set feedback off
SQL> set echo off
SQL> SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name) FROM USER_INDEXES u;

结果:

  CREATE UNIQUE INDEX "JOHNY"."SYS_C0013353" ON "JOHNY"."JOHNY_TABLE" ("ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "JOHNY_TABSPACE"

扫码关注云+社区