2009-12-07 69 views
1

作爲發行版的一部分,我們針對數據庫運行一些PL/SQL腳本。最近有人將;從另一個腳本的另一個腳本的行尾離開,這意味着該腳本沒有運行。因爲這不會導致錯誤,它只是沒有運行,追查發生的事情花了相當長的一段時間。檢查sql腳本是否有效

我想在腳本運行之前檢查腳本中是否存在行尾的;或行後面的/。這變得更加複雜,因爲腳本中的「行」實際上可以跨越多行,如果它是語句或代碼塊的話。

對我來說,這似乎是要做到這一點,我將不得不解析腳本,然後檢查他們滿足上述。

我發現ANTLR並想知道這是否可以做到這一點,因爲似乎有existing PL/SQL grammars但看起來這將是一個簡單的檢查步驟學習曲線。

有誰知道一個簡單的方法或任何其他工具,Eclipse插件等等,我可以用它來檢查腳本中的行被丟失或者在最後一個;或之後就行了/

更新 我們已經做了大部分東西Tom H suggested。腳本運行到我們的測試服務器,並且我們有一個版本表,最後更新。問題在於容器腳本中缺少的分號意味着一個腳本沒有運行,但其餘的包括更新版本號的腳本沒有錯誤地運行。因此,這個問題只能在測試中找到。這需要在運行添加了缺少分號的腳本之前恢復數據庫,因此基本上導致半天的測試時間丟失。如果有一種簡單的方法來檢查之前將腳本運行到測試服務器,它可以節省相當多的時間。

+0

在DB版本系統我用,在更新腳本的開始我設置了版本號和它分配一個「跑」標誌,然後重置標誌爲「已完成」的腳本*年底*。 – 2009-12-08 14:50:15

回答

1

即使腳本是每一個版本不同(而不是創建或替換數據庫中的對象定義源控制結構的一部分),我會採取打破腳本分解成工作的每個文件的最基本單位的做法,使用標準的sql任務通過Ant部署它們。你可能有這些類型的腳本:

  • 創建或替換DBOBJECT ...
  • SQL DML腳本
  • 匿名PL/SQL塊

如果您在標準化一致的語句分隔符(我建議使用「/」,因爲它適用於上述所有情況)並將部署設置爲出錯時,則Ant將部署所有文件或指出爲什麼不能。

我想,如果有對分隔符的選擇還是每個文件報表沒有標準,這將是非常困難的,否則解析一個或多個SQL和/或PLSQL語句的文件和尋找失蹤的分隔符。

0

只是一個想法,但你會這樣做的錯誤嗎?

我認爲,在文件級,缺乏文件中的分號的是不是有問題?但通過批處理運行只會成爲問題?如果是這種情況,也許你可以改變你的批處理來應付這種情況。

如果是的文件,然後測試應該把它撿起來。你不想來解析輸入文件,以確保它們編譯等

3

我MattH,你可能要對這個錯誤的方式達成一致意見。我只是將一個插入語句添加到所有將「版本」行插入到數據庫表中的腳本的末尾。在部署腳本結束時,檢查版本表是否包含所有正確的行是一件容易的事情。

此外,您應該對您的QA服務器準確運行所有發佈腳本,正如它們將在生產中一樣。這就是所有測試發生的地方。你永遠不會做任何服務器除了什麼是你鬆開的步驟 - 你只運行發佈腳本和如果這些發行腳本是不斷改變,那麼你刷新與他們的QA服務器和重做測試。

當你去到你的生產過程中釋放然後被全面測試。作爲故障安全措施,您還可以使用Red Gate的SQL Compare和SQL Data Compare等工具來檢查生產是否與QA服務器匹配。數據比較只會針對某些表(查找表等)。如果您對主表(1M行等)有數據更改,則可以通過自定義腳本來檢查它們是否正確。

+0

我們已經完成了大部分工作,問題在於它只是通過測試纔拿起來的。如果在他們進入測試服務器之前有一種方法可以快速檢查這些事件的腳本,那麼可以節省很多時間。 – 2009-12-08 09:51:05

+0

正如我接着說,跟蹤所有已成功對數據庫運行腳本的日誌表或表的版本可能是你最安全的賭注。 – 2009-12-08 13:16:00