【问题标题】:triggers in sql files with oracle 11g database don't work使用 oracle 11g 数据库的 sql 文件中的触发器不起作用
【发布时间】:2012-01-21 06:57:00
【问题描述】:

我对 Oracle 11g 和 Liquibase 有疑问。我一直在寻找一个好的答案。在我的 db-changelog.xml 中,我指向一个有触发器的 sql 文件。这根本不起作用。我已经用 /\; 测试了您上面所说的内容和一个和几个触发器。我得到一个带有 / 的 ORA-00911。 Ora-00900 带有 END “触发器名称”;在 sql 中。

        CREATE OR REPLACE TRIGGER ADRESSE_ID_TR 
        BEFORE INSERT ON ADRESSE 
        FOR EACH ROW 
        WHEN (new.ID IS NULL) BEGIN 
        SELECT adresse_seq.NEXTVAL 
        INTO   :new.ID 
        FROM   dual; 
        END ADRESSE_ID_TR;\

我的解决方法是在 db-changelog.xml 中添加一个 in。我不喜欢它,因为 db-changelog.xml 会非常大,我希望它在 .sql 文件中而不是在 db-changelog.xml 中。当我们开发 Java 代码时,我们将对数据库进行大量更改。更改应该在更大的 sql 文件中。还是我错了?

另一个问题是,当我使用 Oracle SQL Developer、Toad、SQL Plus 等工具生成 DDL 时,它们不起作用。当我使用工具执行 DDL 时,它们就起作用了。很多 sql 不起作用,因为 Liquibase 可能不支持 SQL。我花了很多时间用 Eclipse 测试我的 SQL 和 Liquibase 来修复 SQL。有什么提示或者你会解决这个问题吗?

【问题讨论】:

    标签: sql triggers oracle11g ddl liquibase


    【解决方案1】:

    这不是有效的触发器语法;下面是:

    CREATE OR REPLACE TRIGGER ADRESSE_ID_TR          
    BEFORE INSERT ON ADRESSE          
    FOR EACH ROW          
    BEGIN
      IF (:new.ID IS NULL)  THEN
        SELECT adresse_seq.NEXTVAL          
          INTO   :new.ID          
          FROM   dual;          
      END IF;
    END ADRESSE_ID_TR;
    / 
    

    【讨论】:

    • 这种语法在 oracle sql developer 和 liquibase 中也会出现错误。
    • 抱歉 - 将 new.id 替换为 :new.id
    • 我有点太快了。应该看过。
    【解决方案2】:

    由于触发代码的更改,我确实收到了错误:

     liquibase.exception.DatabaseException: Error executing SQL END IF: ORA-00900: ugyldig    SQL-setning
    
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104)
    at liquibase.database.AbstractDatabase.execute(AbstractDatabase.java:1075)
    at           liquibase.database.AbstractDatabase.executeStatements(AbstractDatabase.java:1059)
    at liquibase.changelog.ChangeSet.execute(ChangeSet.java:317)
    at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:27)
    at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:58)
    at liquibase.Liquibase.update(Liquibase.java:113)
    at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:244)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
    at    org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:549)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at elling.ui.JettyRunner.run(JettyRunner.java:14)
    at elling.ui.JettyRunner.main(JettyRunner.java:19)
       Caused by: java.sql.SQLSyntaxErrorException: ORA-00900: ugyldig SQL-setning
    

    我的sql是这样的: --liquibase 格式化的sql

    --changeset martin.raczkowski:2011-11-24-SP2_2_5.sql
    DROP TABLE ADRESSE cascade constraints;
    
    CREATE TABLE ADRESSE 
        (   
    ID NUMBER, 
    PERSON_ID NUMBER, 
    GATEADRESSE1 VARCHAR2(256 BYTE), 
    GATEADRESSE2 VARCHAR2(256 BYTE), 
    POSTNUMMER VARCHAR2(20 BYTE), 
    POSTSTED VARCHAR2(256 BYTE), 
    ADRESSETYPE VARCHAR2(20 BYTE), 
    TIDENDRET DATE, 
    SAKSBEHANDLER VARCHAR2(20 BYTE), 
    BYDEL VARCHAR2(20 BYTE), 
    ENHET VARCHAR2(20 BYTE),
    CONSTRAINT ADRESSE_PK PRIMARY KEY 
        (
        ID 
        )
       ENABLE 
       );
    
    CREATE OR REPLACE TRIGGER ADRESSE_ID_TR          
    BEFORE INSERT ON ADRESSE          
    FOR EACH ROW          
    BEGIN
    F (new.ID IS NULL)  THEN
    SELECT adresse_seq.NEXTVAL          
    FROM   dual;          
    END IF;
    END ADRESSE_ID_TR;
    

    我的 db-changelog.xml:(.xml 文件中的触发器工作正常,而我放在 .sql 中的触发器不起作用)

    <?xml version="1.0" encoding="UTF-8"?>
    <databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
    
    <changeSet id="2011_11_24_SP1_2" author="martin.raczkowski" context="test">
    <validCheckSum>3:8769984ba2d1cba936dc212d944d3582</validCheckSum>
        <comment>
            Opprett tabeller person, adresse..
        </comment>
        <sqlFile path="liquibase/2011_11_24_SP1_2.sql" />        
    </changeSet> 
    <changeSet id="2011_11_29_SP2_2_1" author="martin.raczkowski" context="test" >
    <validCheckSum>3:bf2b156fbb7d29fe58defe8bc4600a09</validCheckSum>
        <comment>
            Rename kolonner og droppe kolonner. Laget trigger paa Person og Adresse.
        </comment>
        <sqlFile path="liquibase/2011_11_29_SP2_2_1.sql" />        
    </changeSet>   
    <changeSet id="2011_11_30_SP2_2" author="david.carlsson" context="test" >
    <validCheckSum>3:a88cdfb1b3e60119f2981c0f30ab7ac9</validCheckSum>
        <comment>   
            Opprett key triggers for Person og Adresse
        </comment>
        <createProcedure>
        CREATE OR REPLACE TRIGGER PERSON_ID_TR
            BEFORE INSERT ON PERSON
            FOR EACH ROW
            WHEN (new.ID IS NULL)
            BEGIN
              SELECT person_seq.NEXTVAL
              INTO   :new.ID
              FROM   dual;
            END;
            </createProcedure>
     </changeSet>
        <changeSet id="2011_11_30_SP2_2_2" author="martin.raczkowski" context="test" >
        <validCheckSum>3:d2c3da4e48f183e5d523efa675786c53</validCheckSum>
        <comment>
            Henvendelse tabell oprettes og setter paa sekvens og trigger paa person og adresse.
        </comment>
        <sqlFile path="liquibase/2011_11_30_SP2_2_2.sql" />        
    </changeSet>
     <changeSet id="2011_11_30_SP2_2_3" author="martin.raczkowski" context="test" >
        <comment>
           Trigger Henvendelse_id_tr på henvendelse 
        </comment>
        <sqlFile path="liquibase/2011_11_30_SP2_2_3.sql" />        
    </changeSet>    
    <changeSet id="2011_11_30_SP2_2_4" author="martin.raczkowski" context="test" >
        <comment>   
            Opprett key triggers for henvendelse
        </comment>
        <createProcedure>
            CREATE OR REPLACE TRIGGER HENVENDELSE_ID_TR 
            BEFORE INSERT ON HENVENDELSE 
            FOR EACH ROW
            WHEN(new.ID IS NULL)
            BEGIN
            SELECT henvendelse_seq.NEXTVAL
            INTO :new.ID 
            FROM dual; 
            END;
        </createProcedure>
        <createProcedure>
            CREATE OR REPLACE TRIGGER HENVENDELSE_BEFORE_INSERT_TR
            BEFORE INSERT ON HENVENDELSE
            FOR EACH ROW
            BEGIN 
            :new.OPPRETTET := sysdate; 
            :new.SISTENDRET := sysdate; 
            END;
        </createProcedure>
         <createProcedure>
            CREATE OR REPLACE TRIGGER HENVENDELSE_AFTER_INSERT_TR
            BEFORE INSERT ON HENVENDELSE
            FOR EACH ROW
            BEGIN 
            :new.OPPRETTET := sysdate; 
            :new.SISTENDRET := sysdate; 
            END;
        </createProcedure>
     </changeSet>
      <changeSet id="2011_12_15_SP2_2_5" author="martin.raczkowski" context="test" >
        <comment>
           Adresse tabell oppgradert
        </comment>
        <sqlFile  endDelimiter="/" path="liquibase/2011_12_15_SP2_2_5.sql" />          
      </changeSet>    
    </databaseChangeLog>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多