上次我使用SQL Server 2014时突然因电源故障而导致数据库损坏,下次运行DBCC CHECKDB后,我发现我在SQL Server上创建的一些存储过程仍然缺失。那么有什么方法可以为我的存储过程创建一个成功的备份?
答案 0 :(得分:4)
一个可能性是: 在SQL Server Manangement Studio中右键单击数据库 - 任务 - 生成脚本... 在这里,您可以指定要编写脚本的对象以及保存脚本文件的位置。
我最喜欢的解决方案(尽管工作量更大)是将所有数据库都放在Visual Studio中的数据库项目中。 (关键字:SQL Server数据工具)。不知道这对你有意义,但它非常强大,是一个很棒的事情来部署数据库,管理源代码(例如TFS)......所有的视觉工作室的好处。
答案 1 :(得分:1)
这里正确的解决方案是备份整个数据库,因为存储过程将具有依赖关系 - 如数据库中的表,列,视图等。
如果您只想检索存储过程的文本并将其保存到文件,则可以使用sp_helptext
。例如:
sp_helptext sp_procedureName
答案 2 :(得分:0)
存储过程与代码相同,因此如果这是生产问题,我希望代码是源代码控制的。如果你有,那么你只需从源代码控制中获取代码。如果这是个人数据库,您可以偶尔脚本编写对象并保存到文件,或者创建夜间数据库备份,以便以后可以根据需要进行恢复。
答案 3 :(得分:0)
始终保留所有程序的明文版本存储库。 每个程序制作一个文件!!!
使用数据库脚本时的良好做法
1)保留所有存储过程的版本化存储库。
2)经常提交!
3)每次部署后创建一个标签。
4)永远不要直接在DB上更新程序。
5)保持测试环境与您的作品同步。
6)创建一个管理程序,以便经常在测试环境中重新创建和测试您的程序。
将存储库中的SQL文件连接成一个文件,以便于部署
创建一个bat(如果在Windows上)文件,将* .sql文件合并到一个文本文件中进行部署。为您不希望包含在部署中的过程文件制作* .txt文件。请记住,此合并脚本将在除了空字符之外的每一行上打印ECHO。空行被接受。这是一个例子:
@ECHO ON
REM Prepare variables
REM CD "C:\PRO\integ_bh\trunk"
SETLOCAL EnableDelayedExpansion
SET now=!date:~10,4!_!date:~7,2!_!date:~4,2!
SET staging_file=One_File.txt
SET staging_file_with_date=One_File_%now%.txt
SET file_content=
REM Remove files if already exists
REM IF EXIST %staging_file_with_date% DEL %staging_file_with_date%
REM COPY NUL %staging_file_with_date%
IF EXIST %staging_file% DEL %staging_file%
COPY NUL %staging_file%
REM concatenate files
for /f "delims=|" %%f in ('dir /b *.sql') do ( for /f "delims=" %%c in (%%f) do ( set file_content=%%c ) & ECHO !file_content!>>%staging_file% )
for /f "delims=|" %%f in ('dir /b *.sql') do ( for /f "delims=" %%c in (%%f) do ( set file_content=%%c ) & ECHO !file_content!>>%staging_file_with_date% )
将所有存储过程的创建语句复制到一个文件中
从数据库创建一个程序文件: 易于以不间断的文本打印。由GO分隔。现在,您可以将它们保存在一个文件中,并在任何数据库更新之前保留一个版本。
CREATE
TABLE
#integ_bh_procedures (
[Text] VARCHAR(MAX)
);
DECLARE
@SQL_text VARCHAR(MAX),
@SchemaName VARCHAR(MAX),
@RoutineName VARCHAR(MAX);
SET NOCOUNT ON;
DECLARE procedures_cursor CURSOR
FOR
SELECT s.name [SchemaName] ,o.name [RoutineName]
FROM sys.sql_modules p
INNER JOIN sys.objects o ON p.object_id = o.object_id
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE UPPER(p.[definition]) LIKE UPPER('%dbo%'); -- Use your schema here
OPEN procedures_cursor
FETCH NEXT FROM procedures_cursor
INTO @SchemaName, @RoutineName;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT('-- sp_helptext ''[' + @SchemaName + '].[' + @RoutineName + ']''');
DELETE FROM #integ_bh_procedures;
INSERT INTO #integ_bh_procedures
EXEC('sp_helptext ''[' + @SchemaName + '].[' + @RoutineName + ']''');
INSERT INTO #integ_bh_procedures ([Text]) VALUES(CHAR(13)+CHAR(10) + 'GO'),(CHAR(13)+CHAR(10) + '-- ################################################################################################ --'),(CHAR(13)+CHAR(10) + ''),(CHAR(13)+CHAR(10) + ''),(CHAR(13)+CHAR(10) + '');
FETCH NEXT FROM procedures_cursor
INTO @SchemaName, @RoutineName;
SET @SQL_text = ( SELECT '' + [Text]
FROM #integ_bh_procedures
FOR XML PATH(''), type
).value('.', 'nvarchar(max)');
SET NOCOUNT OFF;
PRINT @SQL_text;
END
CLOSE procedures_cursor;
DEALLOCATE procedures_cursor;
DROP TABLE #integ_bh_procedures;
还有其他简单的解决方案可以使用存储过程。根据您对数据库的权限,您可能难以使用SQL Management Studio提供的默认工具。不确定您的丢失程序是否可以恢复。我只是告诉你我从未放松过我的工作。