gpt4 book ai didi

derby db升级文件权限问题

转载 作者:行者123 更新时间:2023-12-02 09:46:11 26 4
gpt4 key购买 nike

我目前正在运行从版本 10.13.1.1 创建的 derby 数据库实例
我通过运行在 redhat 服务器上的网络模式 (startNetworkServer) 进行连接。

我现在想升级到版本 10.14.2.0

但是,尝试连接到升级后的数据库时,我收到拒绝访问“java.io.FilePermission”错误。

细节:
我去将版本 10.13.1.1 和 10.14.2.0 下载到我的 Windows 桌面上。

使用以下命令创建数据库备份:SYSCS_UTIL.SYSCS_BACKUP_DATABASE

我将此备份复制到 10.13 和 10.14 文件夹。

从我当前的版本(13)开始,我启动网络服务器,然后使用 ij 连接到数据库。这很好用,我可以看到表格。这验证了我的备份没问题。

connect 'jdbc:derby://localhost:1527/c:\Temp\13\database;create=false';

然后我启动我的14版本网络服务器,然后去14的ij。当我尝试连接到备份时:
connect 'jdbc:derby://localhost:1527/c:\Temp\14\database;create=false';

我收到文件权限错误:

ERROR XJ001: DERBY SQL error: ERRORCODE: 0, SQLSTATE: XJ001, SQLERRMC: java.security.AccessControlException access denied ("java.io.FilePermission" "C:\Temp\updating_derby\threatadvisor" "read") XJ001.U



很公平,我认为这是因为我正在尝试连接到旧版本,而没有运行 upgrade=true 参数。当我删除 create 参数并添加 upgrade 参数时,它仍然失败并出现同样的问题。

好的,所以也许我无法通过网络服务器升级数据库,我必须直接连接到数据库。在我的应用程序中,我使用以下连接字符串:
jdbc:derby:C:/Temp/14/database;upgrade=true;

该应用程序在类路径中有版本 14 jar,因此应该使用它并升级。它确实如此,应用程序正常启动,我看到了所有数据。我怎么知道它升级了?因为我尝试使用 13 网络服务器和 ij 连接到这个 14 数据库,它失败了(由于版本的原因)。

所以我做对了吗?不,我再次尝试使用 ij 通过网络服务器连接到这个现已升级的数据库,我再次遇到 java.io.FilePermission 问题。

我进入并确保“数据库”文件夹中的文件夹和文件的实际操作系统权限不仅仅是只读的。没有。然而它仍然错误。

我什至尝试在 redhat 盒子上运行 14 个网络服务器(在不同的端口上),并尝试通过 ij 连接到这个数据库,即使在那里我也遇到了文件权限问题。

我真的不知道下一步该做什么。请帮忙!

仅供引用,来自 derby.log 文件的完整问题:

Tue Jun 11 12:04:15 AEST 2019 : Apache Derby Network Server - 10.14.2.0 - (1828579) started and ready to accept connections on port 1527 Tue Jun 11 12:04:28 AEST 2019 Thread[DRDAConnThread_2,5,main] Cleanup action starting java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Temp\14\database" "read") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkRead(SecurityManager.java:888) at java.io.File.exists(File.java:814) at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:434) at java.io.File.getCanonicalPath(File.java:618) at org.apache.derby.impl.io.DirStorageFactory.doInit(Unknown Source) at org.apache.derby.impl.io.BaseStorageFactory.init(Unknown Source) at org.apache.derby.impl.io.DirStorageFactory.init(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService.privGetStorageFactoryInstance(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService.access$400(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService$12.run(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService$12.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.services.monitor.StorageFactoryService.getCanonicalServiceName(Unknown Source) at org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(Unknown Source) at org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(Unknown Source) at org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection$4.run(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.jdbc.EmbedConnection.startPersistentService(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.(Unknown Source) at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source) at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(Unknown Source) at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source) at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source) at org.apache.derby.jdbc.EmbeddedDriver.connect(Unknown Source) at org.apache.derby.impl.drda.Database.makeConnection(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source) Cleanup action completed



编辑 1
现在尝试按照 guide 设置 security.policy 文件.但是,在基于演示目录中的模板创建新策略文件后,我们甚至无法让 derby 获取我们的文件。
当我们尝试运行时:
java -classpath "C:\Temp\14\lib\derby.jar;C:\Temp\14\lib\derbynet.jar;C:\Temp\14\lib\derbyclient.jar;C:\Temp\14\lib\derbytools.jar;C:\Temp\14\lib\derbyoptionaltools.jar" -Djava.security.manager -Djava.security.policy=C:\Temp\14\server.policy org.apache.derby.drda.NetworkServerControl start

我们收到以下错误:

java.security.AccessControlException: access denied org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" ) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(Unknown Source) at org.apache.derby.iapi.services.monitor.Monitor.getMonitorLite(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil$2.run(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.iapi.services.property.PropertyUtil.getMonitorLite(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.init(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.(Unknown Source) at org.apache.derby.drda.NetworkServerControl.main(Unknown Source)



我知道这一行在策略文件中(并且未注释):
permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals";

但是,我认为它甚至没有拾取我们的策略文件,就好像我们将引用更改为不存在的策略文件一样,我们仍然会遇到相同的错误。

最佳答案

感谢@BryanPendleton 为我指明了正确的方向。对于最初的问题,确实是因为我们需要 server.policy 文件。他的链接很有帮助:
db.apache.org/derby/docs/10.14/security/csecjavasecurity.html

我们遇到的第二个问题是通过使用位于此处的 server.policy 文件模板解决的:
https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/security/rsecbasicserver.html

而不是下载中提供的那个( Derby 下载中的那个没有提到那么多 jar )。更重要的是,我们引用 jar 的方式必须进行调整。您将看到所有示例都是针对 unix 格式的,而我们是在测试 Windows PC 上开发的。因此,而不是像(unix)这样的东西:

grant codeBase "file:///home/someone/derby/lib/derby.jar"

我们需要做:
grant codeBase "file:///C:/Temp/14/lib/derby.jar"

注意 'file' 后面的附加 '/' - 我们假设它只是 "file://C:...."

关于derby db升级文件权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56536146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com