zoukankan      html  css  js  c++  java
  • SQL SERVER 快照维护 存储过程

    SET QUOTED_IDENTIFIER ON
    SET ANSI_NULLS ON
    GO
    
    --生成数据库快照
    CREATE PROC [dbo].[CreateSnapshotForBackUp]
    (
        --数据库名称
        @p_DateBaseName VARCHAR(100),
        --数据库快照文件位置,保留字符
        @p_FilePath VARCHAR(2000),
        --保留最近N个快照,  下面代码是按名称排序的,也可以按创建日期排序.跟据自己需求来.
        @p_RetainN INT
    )
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @strSql VARCHAR(MAX);
        DECLARE @strDatetime VARCHAR(20);
        DECLARE @strDBFileName VARCHAR(200);
        --日期类别为YYYYmmDDHHMMSS
        SET @strDatetime = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ', ''), ':', '');
    
    
        --如果存在此数据库则进行下面的操作
        IF
        (
            SELECT COUNT(*)FROM sys.databases WHERE name = @p_DateBaseName
        ) > 0
        BEGIN
    
            DECLARE @SnapshotName VARCHAR(1000) = @p_DateBaseName + '_snapshot_' + @strDatetime;
            DECLARE @fileName VARCHAR(1000) = @p_FilePath + @p_DateBaseName + '_snapshot_' + @strDatetime + '.ss';
    
    
    
            SET @strSql
                = CONCAT(
                            ' CREATE DATABASE ',
                            @SnapshotName,
                            ' ON (    NAME = ''',
                            @p_DateBaseName,
                            ''',FILENAME = ''',
                            @fileName,
                            ''' ) AS SNAPSHOT OF ',
                            @p_DateBaseName
                        );
    
            BEGIN TRY
                PRINT @strSql;
                EXEC (@strSql);
                PRINT @p_DateBaseName + ' snapshot create successful:' + @SnapshotName;
    
            END TRY
            BEGIN CATCH
                SELECT 'snapshot create fail:'+ERROR_MESSAGE()  throw;
            END CATCH;
    
        END;
    
        --删除过期的数据库快照
        BEGIN TRY
            IF OBJECT_ID('tempdb..#snapshotname') IS NOT NULL
                DROP TABLE #snapshotname;
    
            --取除最近的快照之外的快照名称,这里是按名称排序的. 也可以使用创建日期排序
            SELECT snapShot_database.name,
                   ROW_NUMBER() OVER (ORDER BY snapShot_database.name DESC) id
            INTO #snapshotname
            FROM sys.databases AS source_database
                JOIN sys.databases AS snapShot_database
                    ON source_database.database_id = snapShot_database.source_database_id
            WHERE source_database.name = @p_DateBaseName
            ORDER BY snapShot_database.name DESC OFFSET @p_RetainN ROW FETCH NEXT 100 ROWS ONLY;
    
    
    
            DECLARE @strDropDatabase VARCHAR(MAX) = '';
    
            --如果#snapshotname 存在记录则进行
            IF
            (
                SELECT COUNT(1)FROM #snapshotname
            ) > 0
            BEGIN
    
    
                SELECT @strDropDatabase = @strDropDatabase + ' DROP DATABASE ' + name + ' ; '
                FROM #snapshotname;
    
                EXEC (@strDropDatabase);
    
            END;
    
        END TRY
        BEGIN CATCH
            SELECT N'snapshot delete fail:'+ERROR_MESSAGE() throw;
        END CATCH;
    
    END;
    GO
  • 相关阅读:
    矩阵树定理
    随机乱搞算法
    数学
    BZOJ——3412: [Usaco2009 Dec]Music Notes乐谱
    BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
    洛谷—— P2884 [USACO07MAR]每月的费用Monthly Expense
    洛谷—— P2417 课程
    洛谷—— P1577 切绳子
    COGS 2598. 美丽的感觉
    10.23 模拟赛
  • 原文地址:https://www.cnblogs.com/BinBinGo/p/14774790.html
Copyright © 2011-2022 走看看