从.sql文件恢复SQL Server数据库

3
所以我们有一个加密的数据库,它崩溃了并摧毁了我们整个SQL Server设置。对于我们的数据来说很糟糕,但我们足够聪明,把我们的数据结构/存储过程/函数保存在Git中。
问题是它们保存为.sql文件。
有没有办法从这些文件夹中批量恢复我们的模式?
我已经找了一圈,只能找到从.bak文件或.mdf文件中恢复的教程。这不是懒人的出路-我只需要尽快找到解决方案。任何建议、资源或任何东西都将不胜感激。
谢谢互联网,
Dylan

3
你需要(1)让你的SQL Server再次运行起来,(2)使用适当的参数(例如大小等)创建数据库,然后(3)在这个新数据库上逐个执行.sql脚本。 - marc_s
正在寻找更多批处理解决方案。但是使用 sqlcmd 似乎是关键所在。完成后将发布解决方案。 - Dylan Madisetti
3
你的数据库没有备份文件吗?包括系统数据库? - Kenneth Fisher
那也被加密了 >.< - Dylan Madisetti
2个回答

2

考虑到我尝试恢复的数据结构非常庞大,逐个运行每个文件并不是一个实际可行的解决方案。我相信我可以编写批处理文件,但我很快就在Python中完成了这项任务:

import os, subprocess
processDir = 'C:\\Database-master\\'
files = os.listdir(processDir)
for f in files:
    db = processDir + f
    #potentially drop corrupt db and create new ones with f
    scripts = os.listdir(db)
    for script in scripts:
        path = db + '\\' + script
        proc = subprocess.Popen('sqlcmd -S 127.0.0.1 -i "' + path +'"', shell=True)
        proc.wait()     

1
你将面临的问题是将它们按正确顺序排列。 - RBarryYoung
由于某种原因似乎并不重要。我知道在管理工作室中,您不能基于不存在的表创建函数或过程-但是使用sqlcmd确实可以在表之前创建存储过程。例如:尽管dbo.update.table.sql是其依赖项,但 dbo.SP_update_Claims.storedprocedure.sql 程序仍然运行。非常奇怪? - Dylan Madisetti
1
不完全是这样。存储过程通常不会成为问题,因为它们支持延迟解析。视图通常是问题所在,因为除非所有组成它们的表/视图已经存在,否则无法编译/保存视图。这可能会被忽略,因为一些组织会在视图名称前加上字母“V”。所以,如果脚本按字母顺序执行,那么视图可能会在所有表之后执行。 - RBarryYoung
当然,这也可能意味着您执行脚本的方法正在抑制任何错误,并且您可能会发现有一堆东西丢失了。 - RBarryYoung
我们没有任何视图。也许这是我们的问题,但我们通常会将所有关系都编写成脚本。不过这很好知道。 - Dylan Madisetti

1
如果您的数据库很大/复杂,您将遇到的真正问题不是批处理执行,而是脚本执行的顺序。除非您有一些备份文件,否则这将是真正的问题。
如果您只有脚本,我建议像这样做。
1. 表 2. 视图 3. 其他所有...
只需依次执行一个查询,直到出现错误为止。当您遇到错误时,最可能是因为您正在尝试引用不存在的对象。只需将该脚本保存以供稍后使用,并继续执行脚本。然后再从头开始,浏览导致错误的脚本。现在对象可能已经存在了。重复此操作,直到创建所有对象为止。

我认为解析出类型不会是一个更大的步骤。在我的情况下,我认为这并没有成为什么问题。但知道这一点也是好的。 - Dylan Madisetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接