如何备份 SQL 服务器中的存储过程?
How can I back up a stored procedure in SQL Server?
上次我在使用我的 SQL Server 2014 时,突然由于电源故障,我的数据库损坏了,下次在 运行 DBCC CHECKDB 之后,我发现了一些存储过程,我在我的 SQL 服务器上创建的仍然丢失。那么有什么方法可以为我的存储过程创建成功的备份吗?[=11=]
一种可能是:
在 SQL 服务器管理工作室 右键单击您的数据库 - 任务 - 生成脚本...
在这里您可以指定要编写脚本的对象以及保存脚本文件的位置。
我最喜欢的解决方案(尽管工作量更大)是将我的所有数据库都放在 数据库项目 中 Visual Studio 中。 (关键字:SQL 服务器数据工具)。不知道您是否感兴趣,但它非常强大,非常适合部署数据库、管理源代码(例如 TFS)...所有 visual studio 的好处。
此处正确的解决方案是备份整个数据库,因为您的存储过程将具有依赖性 - 例如数据库中的表、列、视图等。
如果只想检索存储过程的文本并将其保存到文件中,可以使用sp_helptext
。例如:
sp_helptext sp_procedureName
存储过程与代码相同,因此如果这是一个生产问题,我希望代码是源代码控制的。如果你有,那么你只需从源代码管理中获取代码。如果这是一个个人数据库,您可以偶尔编写出您的对象并保存到一个文件中,或者创建您可以在以后需要时恢复的夜间数据库备份。
始终为所有程序保留一个明文版本的存储库。
每个程序制作一个文件!!!
使用数据库脚本的良好做法
1) Keep a versioned repository of all your stored procedures.
2) Commit often !
3) Create a tag after each deployment.
4) Never update procedures directly on DB.
5) Keep a testing environment in sync with your production.
6) Create a management procedure to often recreate and test your procedures on the testing environment.
将存储库中的 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 提供的默认工具。不确定您丢失的程序是否可以恢复。我只是告诉你我是如何从不放松我的工作的。
上次我在使用我的 SQL Server 2014 时,突然由于电源故障,我的数据库损坏了,下次在 运行 DBCC CHECKDB 之后,我发现了一些存储过程,我在我的 SQL 服务器上创建的仍然丢失。那么有什么方法可以为我的存储过程创建成功的备份吗?[=11=]
一种可能是: 在 SQL 服务器管理工作室 右键单击您的数据库 - 任务 - 生成脚本... 在这里您可以指定要编写脚本的对象以及保存脚本文件的位置。
我最喜欢的解决方案(尽管工作量更大)是将我的所有数据库都放在 数据库项目 中 Visual Studio 中。 (关键字:SQL 服务器数据工具)。不知道您是否感兴趣,但它非常强大,非常适合部署数据库、管理源代码(例如 TFS)...所有 visual studio 的好处。
此处正确的解决方案是备份整个数据库,因为您的存储过程将具有依赖性 - 例如数据库中的表、列、视图等。
如果只想检索存储过程的文本并将其保存到文件中,可以使用sp_helptext
。例如:
sp_helptext sp_procedureName
存储过程与代码相同,因此如果这是一个生产问题,我希望代码是源代码控制的。如果你有,那么你只需从源代码管理中获取代码。如果这是一个个人数据库,您可以偶尔编写出您的对象并保存到一个文件中,或者创建您可以在以后需要时恢复的夜间数据库备份。
始终为所有程序保留一个明文版本的存储库。 每个程序制作一个文件!!!
使用数据库脚本的良好做法
1) Keep a versioned repository of all your stored procedures.
2) Commit often !
3) Create a tag after each deployment.
4) Never update procedures directly on DB.
5) Keep a testing environment in sync with your production.
6) Create a management procedure to often recreate and test your procedures on the testing environment.
将存储库中的 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 提供的默认工具。不确定您丢失的程序是否可以恢复。我只是告诉你我是如何从不放松我的工作的。