簡體   English   中英

如何在SQL Server中備份存儲過程?

[英]How can I back up a stored procedure in SQL Server?

上一次使用SQL Server 2014時,突然由於電源故障而導致數據庫損壞,下一次運行DBCC CHECKDB之后,我發現我在SQL Server上創建的一些存儲過程仍然丟失。 因此,有什么方法可以為存儲過程創建成功的備份?

一種可能性是:在SQL Server Manangement Studio中,在數據庫上右擊-任務-生成腳本...在這里,您可以指定要編寫腳本的對象以及在何處保存腳本文件。

我最喜歡的解決方案(盡管這需要更多工作)是將我的所有數據庫都放在Visual Studio的數據庫項目中。 (關鍵字:SQL Server數據工具)。 不知道這對您來說是否有趣,但是它非常強大,並且是部署數據庫,管理源代碼(例如TFS)的好東西……所有Visual Studio好處。

正確的解決方案是備份整個數據庫,因為存儲過程將具有數據庫中的依賴項(例如表,列,視圖等)。 如果只想檢索存儲過程的文本並將其保存到文件中,則可以使用sp_helptext 例如:

sp_helptext sp_procedureName

存儲過程與代碼相同,因此,如果這是生產問題,我希望代碼受源代碼控制。 如果有,那么您只需從源代碼控制中獲取代碼。 如果這是個人數據庫,則有時可以將對象腳本化並保存到文件中,或者創建每夜數據庫備份,以后可以根據需要還原。

始終保持所有過程的明文版本存儲庫。 每個過程制作一個文件!

使用數據庫腳本的良好做法

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提供的默認工具可能會遇到困難。 不知道您丟失的程序是否可以恢復。 我只是告訴你我如何永不松懈我的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM