2

我正在尝试使用 Microsoft JDBC 驱动程序创建登录并删除它。

CREATE LOGIN ? WITH PASSWORD = 'password'

DROP LOGIN ?

但是在这两种情况下我都会遇到异常。

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0'.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332)
    at org.wso2.carbon.rssmanager.core.internal.manager.MSSQLRSSManager.attachUserToDatabase(MSSQLRSSManager.java:512)
    ... 57 more

我在 SO 中发现了类似的问题,但找不到确切的解决方案。

请指教。

谢谢, 巴蒂亚

[更新]

这是我的代码片段。

String sql = "CREATE LOGIN ? WITH PASSWORD = 'abc'";
stmt = conn.prepareStatement(sql);
stmt.setString(1, qualifiedUsername);
stmt.execute();
4

2 回答 2

4

使用 '?' 是您的客户端代码如何接受语句的参数。大多数 DDL 语句(如 CREATE/ALTER/DROP )接受参数。如有疑问,您可以随时查看语句的文档,例如CREATE LOGIN

解决方案是动态构建语句并替换语句本身中的登录名,但请注意这样做会出现 SQL 注入问题,您必须确保正确清理输入。

于 2013-08-06T07:08:12.670 回答
4

你不能用吗?在drop login语句中(就像在 drop table 中,你不能写drop table ?- 我在那些日子里面临同样的问题!),你必须以老式方式构建带有字符串连接的语句。

于 2013-08-06T06:19:43.847 回答