如何使用schema设置Oracle free db dockercontainer?

5ssjco0h  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(123)

我的目标是建立一个Oracle测试数据库,其中包含一个带有两个表的模式。可通过DataGrip(JDBC)连接实现。
从Oracle容器注册表开始:Oracle Container Free Image
我可以使用以下命令启动一个映像:

docker run -d -p 1521:1521 -e ORACLE_PWD=mypw --name my-test-db container-registry.oracle.com/database/free:latest

字符串
可以通过DataGrip中的两个配置访问这个db 1:jdbc:oracle:thin:@localhost:1521:FREE,用户名:system和pw:mypw。可以通过另一个配置访问db 1:jdbc:oracle:thin:@localhost:1521/FREEPDB1,用户名:pdbadmin和pw:mypw。请注意,使用/而不是:。Datagrip自动生成:而不是/
现在,从这里开始,我想使用init.sql脚本创建两个表,它们在自己的模式中可用。
可以通过退出docker命令挂载init.sql脚本,如下所示:

docker run -d -p 1521:1521 -e ORACLE_PWD=pw -v C:\Users\MyUser\Documents\Code\test-db-startup:/opt/oracle/scripts/startup --name my-test-db container-registry.oracle.com/database/free:latest


init.sql位于C:\Users\MyUser\Documents\Code\test-db-startup,包含两个简单的表:

-- Creating the Invoice Table
CREATE TABLE INVOICE (
    EXTERNAL_ID NUMBER(10) NOT NULL,
    DUEDATE DATE,
    PRIMARY KEY (EXTERNAL_ID)
);

-- Creating the Line Table
CREATE TABLE LINE (
    EXTERNAL_ID NUMBER(10) NOT NULL,
    LINENO NUMBER(10) NOT NULL,
    PRICE NUMBER(18, 6),
    PRIMARY KEY (EXTERNAL_ID, LINENO)
);


根据日志创建的表,我在哪里可以找到他们在哪个模式?
我如何调整初始化脚本,使它在一个新的模式中组织表,例如“TESTDATA”,它可以从Datagrip访问并作为一个模式列出?
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj31580.html CREATE SCHEMA命令看起来很有前途,但不知何故我无法处理授权部分,它总是声称它丢失了。
在PostgreSQL中,我会创建一个新的数据库,在Oracle中这样做的最佳实践是什么?

vbopmzt1

vbopmzt11#

因此,您的init.sql脚本(init.sql is located at C:\Users\MyUser\Documents\Code\test-db-startup)缺少一些东西。根据文档here,Oracle DB将使用sys as sysdba运行您的安装脚本,并且很可能在CDB而不是PDB中运行。因此,在您的init.sql脚本中,您希望执行以下操作:
1.将会话设置为PDB

alter session set container=FREEPDB1;

1.通过创建用户来创建模式,这使您可以控制表的位置,而不是其他模式

create user myuser no authentication;
grant connect, resource to myuser;
grant unlimited tablespace to myuser; -- fine-tune this later

1.使用指定的模式名称创建表,例如

-- Creating the Invoice Table in myuser schema
CREATE TABLE myuser.INVOICE (
   EXTERNAL_ID NUMBER(10) NOT NULL,
   DUEDATE DATE,
   PRIMARY KEY (EXTERNAL_ID)
);

至于你的表是在哪里创建的问题,它应该在CDB和MySQL模式中。你可以通过以下方式检查:

-- using sqlcl
connect sys@localhost:1521 as sysdba;

select table_name, owner from dba_tables where upper(TABLE_NAME) in ('INVOICE', 'LINE');

-- result
SQL> select table_name, owner from dba_tables where upper(TABLE_NAME) in ('INVOICE', 'LINE');

TABLE_NAME    OWNER     
_____________ _________ 
INVOICE       SYS    
LINE          SYS


因此,您需要更改会话,创建模式并在模式中创建表。如果成功,

-- using sqlcl
connect system@localhost:1521/FREEPDB1;

-- result
SQL> select table_name, owner from dba_tables where upper(TABLE_NAME) in ('INVOICE', 'LINE');

TABLE_NAME    OWNER     
_____________ _________ 
INVOICE       MYUSER    
LINE          MYUSER


然后,您可以更改myuser密码或将访问权限授予其他用户;

相关问题