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

在何处放置Oracle只读用户的databasechangelog,oracle,liquibase,Oracle,Liquibase,这听起来像个愚蠢的问题,但请容忍我 我有一个Oracle数据库,由用户所有者写入。数据库是使用liquibase创建的,DATABASECHANGELOG和DATABASECHANGELOGLOCK表位于所有者架构中。到目前为止,一切顺利 现在我想创建一个只读用户READER。READER需要对表OWNER.PERSON的读取权限,但不需要其他权限。以下是我迄今为止所做的工作: 作为数据库管理员: create user READER identified by "password"; gran

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

我有一个Oracle数据库,由用户所有者写入。数据库是使用liquibase创建的,DATABASECHANGELOG和DATABASECHANGELOGLOCK表位于所有者架构中。到目前为止,一切顺利

现在我想创建一个只读用户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;
现在,读卡器可以连接到数据库并

SELECT firstname, lastname from PERSON;
成功

我想把这个液化。所以在
owner.xml
中我说:

<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>
结果令人惊讶: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在不考虑模式和目录的情况下检查是否存在?我错过了一个明显的设置吗?

它看起来像一个bug。我用你的信息创建了,修复程序将在Liquibase 3.3.0中发布,大约在下周发布

liquibase \
  --username=READER \
  --password=password \
  --url=jdbc:to:oracle \
  --defaultSchemaName=READER \
  --driver=com.oracle.jdbc.OracleDriver \
  --changeLogFile=reader.xml \
  --liquibaseSchemaName=OWNER \
  --liquibaseCatalogName=OWNER \
  updateSQL
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));