提交 da936163 authored 作者: Thomas Mueller's avatar Thomas Mueller

Dropping the current user is now allowed if another admin user exists.

上级 a5463863
......@@ -46,7 +46,15 @@ public class DropUser extends DefineCommand {
}
} else {
if (user == session.getUser()) {
throw Message.getSQLException(ErrorCode.CANNOT_DROP_CURRENT_USER);
int adminUserCount = 0;
for (User u : db.getAllUsers()) {
if (u.isAdmin()) {
adminUserCount++;
}
}
if (adminUserCount == 1) {
throw Message.getSQLException(ErrorCode.CANNOT_DROP_CURRENT_USER);
}
}
user.checkOwnsNoSchemas();
db.removeDatabaseObject(session, user);
......
......@@ -13,6 +13,7 @@ import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import org.h2.constant.ErrorCode;
import org.h2.test.TestBase;
import org.h2.util.FileUtils;
......@@ -33,6 +34,7 @@ public class TestRights extends TestBase {
}
public void test() throws SQLException {
testDropOwnUser();
testGetTables();
testDropTempTables();
// testLowerCaseUser();
......@@ -41,6 +43,30 @@ public class TestRights extends TestBase {
deleteDb("rights");
}
private void testDropOwnUser() throws SQLException {
deleteDb("rights");
String user = getUser().toUpperCase();
Connection conn = getConnection("rights");
stat = conn.createStatement();
try {
stat.execute("DROP USER " + user);
fail();
} catch (SQLException e) {
assertEquals(ErrorCode.CANNOT_DROP_CURRENT_USER, e.getErrorCode());
}
stat.execute("CREATE USER TEST PASSWORD 'TEST' ADMIN");
stat.execute("DROP USER " + user);
conn.close();
if (!config.memory) {
try {
getConnection("rights");
fail();
} catch (SQLException e) {
assertKnownException(e);
}
}
}
// public void testLowerCaseUser() throws SQLException {
// Documentation: for compatibility,
// only unquoted or uppercase user names are allowed.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论