2012-12-26 68 views
1

我正在開展一項教育項目,讓學生在SQL上測試他們的技能; 我們創建了一些問題,並要求學生解決它們。驗證SQL查詢和結果集

,問題就出現在這裏:

  1. 如何創建SQL問題?我的意思是,假設我讓一個學生創建一個包含約束和數據類型的表,該表將在哪裏創建?在我的生產數據庫?我猜不會;如果我把我的數據庫暴露給最終用戶[他們],他們會試圖破壞它。
  2. 如何驗證結果集[Create/Alter/Insert/Update/Rename]
  3. 如何爲不同用戶的答案建立隔離?

我不知道SQL Fiddle如何處理這些情況,但我的要求與SQL小提琴相同。

我發現Validation of Scripts但這個特定於SQL Server,我的問題不限於一個平臺(DBMS)。

+0

爲什麼不直接使用SQL Fiddle?另外,如果您對SQL小提琴如何做什麼感到好奇,請隨時查看我在GitHub上的源代碼 - 它都在那裏:https://github.com/jakefeasel/sqlfiddle –

+0

我不知道那裏是由你支持,API? – joshua

+0

你需要提供什麼,這是不是從UI簡單提供?當然,你可以給你的學生鏈接到一個已啓動的模式提琴(類似於http://sqlfiddle.com/#!2/a2581),然後讓他們發送鏈接回他們已完成的查詢。 –

回答

2

如果您希望向SQL服務器提供一個允許學生執行查詢但不銷燬數據庫的自由格式窗口(如SQL Fiddle所做的那樣),那麼最簡單的方法就是構建一個web應用程序將他們的SQL作爲輸入並在事務中運行它。在執行時從每個查詢中捕獲結果集。在執行每個SQL語句之後,回滾事務;然後他們的變化都不會被提交給服務器。

如果你懷疑你的學生非常惡作劇,並會毫不留情地破壞數據庫(正如我與SQL小提琴用戶一樣),那麼你將不得不防範明確的交易提交,如commit transaction;。防範這一點非常依賴於數據庫;我建議看through my code on github看我如何保護SQL Fiddle的各種數據庫(提示 - 最簡單的服務器來保護是PostgreSQL;如果可以的話,使用它)。您也可能會發現閱讀我在dba.se上關於防止顯式提交的問題時感興趣:Disable explicit commits in JDBC, detect them in SQL, or put the database in a readonly state

+2

雖然是*所有* DDL事務安全的嗎?鏈接執行?防止不需要的交易?不知何故,我認爲這可能不夠「安全」。另外,不要忘記DOS /資源攻擊。 – 2012-12-26 06:11:35

+0

@pst - 它是高度數據庫特定的。這裏有一篇很好的文章比較了各種數據庫中的事務性ddl:http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis。防止資源攻擊也是廠商特有的:MS SQL使用成本管理器; Oracle對配置文件有資源限制;其他人不得不簡單地使用連接超時。 –

+0

(我的觀點是這個回覆中的第一段不夠充分,掩蓋了很多問題,並暗示了一些「安全」;它是第一個但並不像其他問題那麼重要。) – 2012-12-26 06:13:52