如何在 Oracle Database 11g 中创建新模式/新用户?
Posted
技术标签:
【中文标题】如何在 Oracle Database 11g 中创建新模式/新用户?【英文标题】:How to create a new schema/new user in Oracle Database 11g? 【发布时间】:2013-08-26 12:32:25 【问题描述】:我已申请在一家公司实习,作为一个问题,他们要求我为他们的公司创建一个具有特定要求的架构,并将 DDL 文件邮寄给他们。我已经安装了 Oracle 数据库 11g 快捷版,但是如何在 Oracle 数据库 11g 中创建新模式?我在网上搜索了一个解决方案,但我不明白该怎么做。创建架构后,我应该邮寄哪个文件?
【问题讨论】:
create user foo ...
。请阅读手册-
请问什么是oracle自动存储管理集群?
本网站不能替代您自己研究和从产品文档中学习。搜索 Ben 为该术语提供的链接也会告诉您 ASM 是什么。你需要从头开始。你不能指望这里的人来解释整个Oracle,这个话题太大了;甚至解释你遇到的每一个新术语。也许你应该向公司说明你没有任何Oracle知识但想学习,看看他们是否可以为你提供培训。
对于 Oracle 的完全新手,如果您能够使用 Oracle 数据库 XE,则该过程将得到简化。 XE 提供了一个 Web UI 来创建一个新的用户/模式(又名“Application Express 工作区”)我在 XE 11.2 中尝试过这个。感谢@vitfo 获得下面完整的详细 11g 答案。
【参考方案1】:
一般来说,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;
创建临时表空间(临时表空间是数据库中的空间分配,可以包含仅在会话期间持续存在的临时数据。这些临时数据在进程或实例失败后无法恢复。):
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 以重新创建对象。”。 (在http://www.dba-oracle.com/oracle_tips_dbms_metadata.htm的帮助下)
对于表:
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"
更多信息:
DDL
http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_1001.htmDBMS_METADATA
http://www.dba-oracle.com/t_1_dbms_metadata.htm http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_metada.htm#ARPLS026 http://docs.oracle.com/cd/B28359_01/server.111/b28310/general010.htm#ADMIN11562架构对象
http://docs.oracle.com/cd/B19306_01/server.102/b14220/schema.htm架构和用户之间的区别
https://dba.stackexchange.com/questions/37012/difference-between-database-vs-user-vs-schema Difference between a user and a schema in Oracle?特权
http://docs.oracle.com/cd/E11882_01/timesten.112/e21642/privileges.htm#TTSQL338创建用户/模式
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8003.htm http://www.techonthenet.com/oracle/schemas/create_schema.php创建表空间
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7003.htm#i2231734SQL Plus 命令
http://ss64.com/ora/syntax-sqlplus.html【讨论】:
开头的/ as sysdba
表示从Windows 命令shell 运行“c:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe / as sysdba
”。
也很方便拥有:GRANT CREATE VIEW TO sqlplus system/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=127.0.0.1)(Port=1521))(CONNECT_DATA=(SID=XE)))
连接,然后输入您的所有这些命令。但是然后,做一个connect myuser
我得到错误ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist̀
您能给我们完整的sqlplus
命令吗?就像,基于上面刚刚创建的用户,拥有完整的命令sqlplus ???/???@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=127.0.0.1)(Port=1521))(CONNECT_DATA=(SID=???))
运行create user ... default tablespace ...
命令时出现错误ORA-65096: invalid common user or role name
【参考方案2】:
这是一个有效的例子:
CREATE USER auto_exchange IDENTIFIED BY 123456;
GRANT RESOURCE TO auto_exchange;
GRANT CONNECT TO auto_exchange;
GRANT CREATE VIEW TO auto_exchange;
GRANT CREATE SESSION TO auto_exchange;
GRANT UNLIMITED TABLESPACE TO auto_exchange;
【讨论】:
如果遇到“error: ORA-65096: invalid common user or role name”,请确保执行“alter session set "_ORACLE_SCRIPT"=true;
”。【参考方案3】:
让我们开始吧。您对 Oracle 有任何了解吗?
首先您需要了解什么是 SCHEMA。 模式是数据的逻辑结构或模式对象的集合。架构由数据库用户拥有,并与该用户具有相同的名称。每个用户都拥有一个模式。可以使用 SQL 创建和操作模式对象。
-
创建用户编码器; -- 每当您在 Oracle 中创建新用户时,都会创建一个与用户名同名的模式,并在其中存储他的所有对象。
向编码器授予创建会话; -- 做不到这一点你什么都做不了。
要访问其他用户的架构,您需要被授予对该架构上特定对象的权限,或者可以选择分配 SYSDBA 角色。
这应该让你开始。
【讨论】:
【参考方案4】:SQL> select Username from dba_users
2 ;
USERNAME
------------------------------
SYS
SYSTEM
ANONYMOUS
APEX_PUBLIC_USER
FLOWS_FILES
APEX_040000
OUTLN
DIP
ORACLE_OCM
XS$NULL
MDSYS
USERNAME
------------------------------
CTXSYS
DBSNMP
XDB
APPQOSSYS
HR
16 rows selected.
SQL> create user testdb identified by password;
User created.
SQL> select username from dba_users;
USERNAME
------------------------------
TESTDB
SYS
SYSTEM
ANONYMOUS
APEX_PUBLIC_USER
FLOWS_FILES
APEX_040000
OUTLN
DIP
ORACLE_OCM
XS$NULL
USERNAME
------------------------------
MDSYS
CTXSYS
DBSNMP
XDB
APPQOSSYS
HR
17 rows selected.
SQL> grant create session to testdb;
Grant succeeded.
SQL> create tablespace testdb_tablespace
2 datafile 'testdb_tabspace.dat'
3 size 10M autoextend on;
Tablespace created.
SQL> create temporary tablespace testdb_tablespace_temp
2 tempfile 'testdb_tabspace_temp.dat'
3 size 5M autoextend on;
Tablespace created.
SQL> drop user testdb;
User dropped.
SQL> create user testdb
2 identified by password
3 default tablespace testdb_tablespace
4 temporary tablespace testdb_tablespace_temp;
User created.
SQL> grant create session to testdb;
Grant succeeded.
SQL> grant create table to testdb;
Grant succeeded.
SQL> grant unlimited tablespace to testdb;
Grant succeeded.
SQL>
【讨论】:
【参考方案5】:从 oracle Sql 开发人员,在 sql 工作表中执行以下操作:
create user lctest identified by lctest;
grant dba to lctest;
然后右键单击“Oracle 连接”-> 新建连接,然后进行从连接名到用户名密码的所有 lctest。测试连接应通过。然后连接后,您将看到架构。
【讨论】:
以上是关于如何在 Oracle Database 11g 中创建新模式/新用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 ssh 隧道链(双隧道,公司网络中的服务器)连接到 Oracle Database 11g 服务器?
Oracle11g的database 和client的区别是什么?
Oracle - 安装 Oracle Database 11g Release 2