【问题标题】:Can I use JDBC to set Micrososft SQL Server read only?我可以使用 JDBC 将 Microsoft SQL Server 设置为只读吗?
【发布时间】:2022-01-14 16:23:48
【问题描述】:

我正在制作一个在 Docker 映像中运行 Microsoft SQL Server 的 Clojure 库。我正在使用图像 2019-CU14-ubuntu-20.04。

有一个 JDBC 宏 with-db-transaction 可以采用只读参数。这适用于 PostgreSQL 映像,但不适用于 Microsoft SQL Server。有什么方法可以将与 SQL Server 的连接设置为只读?

【问题讨论】:

    标签: sql-server docker jdbc clojure


    【解决方案1】:

    JDBC 没有只读事务的概念,但它确实支持只读连接(但仅作为提示,因此不一定需要底层数据库或驱动程序的支持)。一些驱动程序会忽略此提示,而另一些驱动程序则使用它来启动只读事务。

    Microsoft SQL Server JDBC 驱动程序不支持它;在SQLServerConnection 中实现Connection.setReadOnly(boolean) 什么都不做:

    @Override
    public void setReadOnly(boolean readOnly) throws SQLServerException {
        if (loggerExternal.isLoggable(Level.FINER))
            loggerExternal.entering(loggingClassName, "setReadOnly", readOnly);
        checkClosed();
        // do nothing per spec
        loggerExternal.exiting(loggingClassName, "setReadOnly");
    }
    

    换句话说,不能将连接设置为 SQL Server 的只读。

    【讨论】:

    • 此外,如果要考虑可移植性,请注意“只读”可能具有奇怪的含义。一些 MariaDB “选择”语句无法在只读连接上完成 - 我在递归 CTE 中看到了这一点。无论如何,使用适当限制的用户帐户可能是比 JDBC 的只读连接更好的解决方案。
    • 作为 clojure.java.jdbc 的维护者和 next.jdbc 的创建者,我想强调的是,JDBC 中特定于数据库的可变性之多令人震惊。即使使用 JDBC 的“标准”,一旦您偏离主流路径,行为就会因数据库而异...
    • @SeanCorfield 这有几个原因,但最重要的一个可能是政治和“最低公分母”的支持。也就是说,我认为与其他语言的数据库支持相比,JDBC 做得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2013-09-24
    • 2011-03-06
    相关资源
    最近更新 更多