1

我正在开展一个教育项目,让学生测试他们的 SQL 技能;我们创建一些问题并要求学生解决这些问题。

问题来了:

  1. 如何创建 SQL 问题?我的意思是,假设我让一个学生创建一个包含一些约束和数据类型的表,这个表将在哪里创建?在我的生产数据库中?我猜不会; 如果我将我的数据库暴露给最终用户 [邪恶],他们会试图破坏它。
  2. 如何验证结果集[Create/Alter/Insert/Update/Rename]
  3. 如何为不同用户的答案建立隔离?

我不知道SQL Fiddle如何处理这些场景,但我的要求与 SQL Fiddle 相同。

我找到了 Validation of Scripts但这特定于 SQL Server,而且我的问题不限于一个平台(DBMS)。

4

1 回答 1

2

如果您希望在 SQL 服务器中提供一个自由格式的窗口,允许学生执行查询但不破坏数据库(就像 SQL Fiddle 所做的那样),那么最简单的事情就是构建一个将他们的 SQL 作为输入并在事务中运行它。在执行时从每个查询中捕获结果集。在执行完他们的每一条 SQL 语句后,回滚事务;然后,他们的任何更改都不会提交给服务器。

如果您怀疑您的学生非常淘气并且会不惜一切代价破坏数据库(就像我对 SQL Fiddle 用户所做的那样),那么您将不得不提防显式事务提交,例如commit transaction;. 防范这种情况是高度特定于数据库的;我建议在 github上查看我的代码,看看我如何保护 SQL Fiddle 的各种数据库(提示 - 最容易保护的服务器是 PostgreSQL;如果可以的话,请使用它)。您可能还会发现阅读我在 dba.se 上关于防止显式提交的问题很有趣:禁用 JDBC 中的显式提交,在 SQL 中检测它们,或将数据库置于只读状态

于 2012-12-26T06:05:40.403 回答