如何在SQL Server中备份存储过程?

时间:2015-07-09 11:53:42

标签: sql sql-server sql-server-2014

上次我使用SQL Server 2014时突然因电源故障而导致数据库损坏,下次运行DBCC CHECKDB后,我发现我在SQL Server上创建的一些存储过程仍然缺失。那么有什么方法可以为我的存储过程创建一个成功的备份?

4 个答案:

答案 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提供的默认工具。不确定您的丢失程序是否可以恢复。我只是告诉你我从未放松过我的工作。