dbms_实用程序中的Oracle错误

dbms_实用程序中的Oracle错误,oracle,triggers,database-connection,Oracle,Triggers,Database Connection,当我试图创建一个超过30个字符的数据库用户,然后在其中创建一个触发器(在一个脚本中)时,出现了这个问题。用户没有被创建,因为它有超过30个字符,但不知怎的,触发器被创建了。现在我无法再登录到数据库,当我的java应用程序尝试连接到此数据库时,会抛出以下异常 Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (ORA-00604: error occurred at recursive SQL

当我试图创建一个超过30个字符的数据库用户,然后在其中创建一个触发器(在一个脚本中)时,出现了这个问题。用户没有被创建,因为它有超过30个字符,但不知怎的,触发器被创建了。现在我无法再登录到数据库,当我的java应用程序尝试连接到此数据库时,会抛出以下异常

 Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory 
 (ORA-00604: error occurred at recursive SQL level 1
 ORA-00972: identifier is too long
ORA-06512: at "SYS.DBMS_UTILITY", line 833
ORA-06512: at "SYS.DBMS_SESSION", line 230
ORA-06512: at line 2
)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2303)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2043)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228)
    ... 95 more
Caused by: java.sql.SQLException: ORA-00604: error occurred at recursive SQL 
level 1
ORA-00972: identifier is too long
ORA-06512: at "SYS.DBMS_UTILITY", line 833
ORA-06512: at "SYS.DBMS_SESSION", line 230
ORA-06512: at line 2

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:600)
    at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:445)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at org.apache.tomcat.dbcp.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
    at org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:257)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2313)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2299)

触发器是在系统级别添加的,包含30多个字符,导致此问题。现在问题解决了。

您可以作为系统连接吗?或者你有一个可以的DBA吗?不,我没有这个数据库的DBA。我执行了最后提到的脚本(但不是TESTDB,我之前给出了30多个字符),那么您有一个名为MAINDB的用户吗?另外,请澄清您是否可以作为SYS连接到数据库(可能使用SQL
*Plus
connect/as sysdba`?)。最后,你是从哪里得到这个脚本的?为什么要更改它以创建一个非法长名称的用户?乍一看,在发布的触发器中没有任何东西会导致您所说的错误。因此,您的实际触发器可能不同,可能将模式更改为另一个非法的长模式名称。如果你想让我们帮助你,你必须发布你正在使用的确切代码。否则你就是在浪费每个人的时间,因为我输入了这些长评论,要求提供更多细节。@APC你是对的。那剧本没问题。即使我创建了一个具有连接权限的新用户,也会出现此错误。我想这是由于其他原因。我会弄明白的。谢谢你的建议。
-- USER SQL
CREATE USER TESTDB IDENTIFIED BY nodba ;


-- ROLES

GRANT "CONNECT" TO TESTDB ;

-- SYSTEM PRIVILEGES
GRANT SELECT ANY TABLE TO TESTDB ;
GRANT SELECT ANY SEQUENCE TO TESTDB ;
GRANT SELECT ANY TRANSACTION TO TESTDB ;
GRANT UPDATE ANY TABLE TO TESTDB ;
GRANT INSERT ANY TABLE TO TESTDB ;
GRANT DELETE ANY TABLE TO TESTDB ;

create role TestRole;

grant TestRole to TESTDB;


ALTER SESSION SET CURRENT_SCHEMA = TESTDB;

create or replace trigger readonly_logon_trigger
after logon on database
begin
if (dbms_session.is_role_enabled('TestRole')) then
 execute immediate 'alter session set current_schema = MAINDB';
end if;
end;