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

问题描述 投票:0回答:5

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

sql sql-server sql-server-2014
5个回答
6
投票

一个可能性是: 在 SQL Server Manangement Studio 中右键单击您的数据库 - 任务 - 生成脚本... 您可以在此处指定要编写脚本的对象以及保存脚本文件的位置。

我最喜欢的解决方案(虽然工作更多)是在 Visual Studio 的Database Projects 中拥有我的所有数据库。 (关键字:SQL Server 数据工具)。不知道你是否感兴趣,但它非常强大,而且非常适合部署数据库、管理源代码(例如 TFS)……所有 visual studio 的好处。


1
投票

这里正确的解决方案是备份整个数据库,因为您的存储过程将具有依赖性 - 如数据库中的表、列、视图等。 如果只想检索存储过程的文本并将其保存到文件中,可以使用

sp_helptext
。例如:

sp_helptext sp_procedureName

0
投票

存储过程与代码相同,所以如果这是一个生产问题,我希望代码是源代码控制的。如果你有,那么你只需从源代码管理中获取代码。如果这是个人数据库,您可以偶尔编写对象脚本并保存到文件中,或者创建夜间数据库备份,以后需要时可以恢复。


0
投票

始终保持所有程序的明文版本存储库。 每个程序制作一个文件!!!

使用数据库脚本时的良好实践

1) 保留所有存储过程的版本存储库。

2)经常提交!

3) 每次部署后创建一个标签。

4)切勿直接在数据库上更新程序。

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


0
投票

exec sp_rename '存储过程的新名称''存储过程的旧名称'

© www.soinside.com 2019 - 2024. All rights reserved.