当前位置: 首页 > 知识库问答 >
问题:

在何处放置Oracle只读用户的databasechangelog

谢华彩
2023-03-14

这听起来像个愚蠢的问题,但请容忍我。

我有一个Oracle数据库,由用户OWNER写入。该数据库是用liquibase创建的,DATABASE CHANGELOG和DATABASE CHANGELOGLOCK表驻留在OWNER模式中。到目前为止,一切顺利。

现在我想创建一个只读用户READER。READER需要对表OWNER. PERSON的读取访问权限,但仅此而已。这是我到目前为止所做的:

作为数据库管理员:

create user READER identified by "password";
grant create session to READER;  -- necessary for READER to connect to the DB
grant create synonym to READER;  -- this should be all READER needs to see

然后作为所有者:

grant select on PERSON to READER;

最后,作为读者:

create or replace synonym PERSON for OWNER.PERSON;

现在READER可以连接到数据库并

SELECT firstname, lastname from PERSON;

成功。

<changeSet author="me" id="owner_grants">
  <preConditions onFail="CONTINUE">
    <dbms type="oracle"/>
  </preConditions>
  <sql>
    grant insert,select,update,delete on DATABASECHANGELOG to READER;
    grant insert,select,update,delete on DATABASECHANGELOGLOCK to READER;
    grant select on PERSON to READER;
  </sql>
  <rollback>
    revoke insert,select,update,delete on DATABASECHANGELOG from READER;
    revoke insert,select,update,delete on DATABASECHANGELOGLOCK from READER;
    revoke select on PERSON from READER;
  </rollback>
</changeSet>

这工作顺利。接下来,我添加同义词定义:

<changeSet author="me" id="reader_synonyms">
  <preCondithtml" target="_blank">ions onFail="CONTINUE">
    <dbms type="oracle"/>
  </preConditions>
  <sql>
    create or replace synonym PERSON for OWNER.PERSON;
  </sql>
  <rollback>
    drop synonym PERSON;
  </rollback>
</changeSet>

接下来,我在调用中设置--liquibaseSchemaName和--liquibaseCatalogName:

liquibase \
  --username=READER \
  --password=password \
  --url=jdbc:to:oracle \
  --defaultSchemaName=READER \
  --driver=com.oracle.jdbc.OracleDriver \
  --changeLogFile=reader.xml \
  --liquibaseSchemaName=OWNER \
  --liquibaseCatalogName=OWNER \
  updateSQL

结果令人惊讶:liquibase试图在正确的模式中找到表,但没有注意到它们已经存在,并试图创建它们:

SET DEFINE OFF;

-- Create Database Lock Table
CREATE TABLE OWNER.DATABASECHANGELOGLOCK (ID NUMBER(10) NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID));

-- Lock Database
-- Create Database Change Log Table
CREATE TABLE OWNER.DATABASECHANGELOG (ID VARCHAR2(255) NOT NULL, AUTHOR VARCHAR2(255) NOT NULL, FILENAME VARCHAR2(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED NUMBER(10) NOT NULL, EXECTYPE VARCHAR2(10) NOT NULL, MD5SUM VARCHAR2(35), DESCRIPTION VARCHAR2(255), COMMENTS VARCHAR2(255), TAG VARCHAR2(255), LIQUIBASE VARCHAR2(20));

这会失败,因为权限不足,因为读取器没有创建表的权限。但我不明白为什么liquibase认为首先必须创建表,因为它们就在那里,因为所有者创建了它们。我检查了这些表是否确实存在,读者可以对它们进行读写。

这是怎么回事?我能告诉liquibase“相信我,桌子在那里吗?”或者liquibase是否在不考虑模式和目录的情况下检查存在?我错过了一个明显的场景吗?

共有1个答案

柳星晖
2023-03-14

它看起来像一个错误。我用你的信息创建了https://liquibase.jira.com/browse/CORE-2087,修复将在下周左右发布的Liquibase 3.3.0中进行。

 类似资料:
  • 问题内容: 我有一个架构和一个具有相同名称的用户:。为了进行开发,我想在Java应用程序中以只读模式使用它。因此,我为只读应用程序创建了一个新用户。 运行应用程序时,我得到表不存在的错误。在互联网上寻找解决方案时,我遇到了。因此,我为架构添加了同义词: 现在,我在应用程序中遇到此错误: 我的方法有什么问题? -更新- 似乎在10g中删除了为模式创建同义词的步骤(Oracle:是否可以为模式创建同义

  • 是否有方法从oracle数据库获取只读JDBC连接。通常,我需要一个jdbc url参数来启用它,比如: 我正在使用薄驱动程序

  • 有一系列关于Kafka交易和一次性交付的优秀文章 在其中一篇文章中,作者谈到了消费者: 因此,在消费者端,您有两个选项来读取事务性消息,通过“isolation.level”消费者配置来表示: read_committed:除了读取不属于事务的消息外,还可以在事务提交后读取属于事务的消息。 read_uncommitted(读取未提交):按偏移顺序读取所有消息,而无需等待事务提交。此选项类似于Ka

  • 我使用只读用户连接到oracle数据库,并且在sql developer中设置连接时使用了服务名,因此我不知道SID(模式)。 我如何找到我连接到的架构名称?

  • 或者,是否可以创建对某些资源具有有限只读权限的g-suite用户?

  • 问题内容: 在我的Web应用程序中,我必须将电子邮件发送给一组预定义的用户,例如,因此我希望将其添加到文件中并在需要时进行访问。这是正确的过程吗?如果是这样,那我应该把这个文件放在哪里?我正在使用Netbeans IDE,它具有用于源文件和JSP文件的两个单独的文件夹。 问题答案: 这是你的选择。Java Web应用程序归档(WAR)中基本上有三种方式: 1.将其放在类路径中 这样就可以使用相对于