USE [Levelcode-LevelOS]
GO

-- =============================================
-- Procedure: Limpeza de backups antigos (+15 dias)
-- =============================================
DROP PROCEDURE IF EXISTS [dbo].[sp_LimpezaBackups]
GO

CREATE PROCEDURE [dbo].[sp_LimpezaBackups]
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DataCorte DATETIME = DATEADD(DAY, -15, GETDATE());
    DECLARE @Comando   NVARCHAR(500);
    DECLARE @Arquivo   NVARCHAR(500);

    -- Cursor nos backups com mais de 15 dias
    DECLARE cur CURSOR FOR
        SELECT DISTINCT bmf.physical_device_name
        FROM msdb.dbo.backupset bs
        JOIN msdb.dbo.backupmediafamily bmf 
            ON bs.media_set_id = bmf.media_set_id
        WHERE bs.database_name    = 'Levelcode-LevelOS'
          AND bs.backup_finish_date < @DataCorte
          AND bmf.physical_device_name LIKE '/var/opt/mssql/backups/%';

    OPEN cur;
    FETCH NEXT FROM cur INTO @Arquivo;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- Deleta o arquivo físico no Linux
        SET @Comando = 'rm -f ' + @Arquivo;
        EXEC xp_cmdshell @Comando;

        -- Remove o histórico do msdb
        PRINT 'Removido: ' + @Arquivo;

        FETCH NEXT FROM cur INTO @Arquivo;
    END

    CLOSE cur;
    DEALLOCATE cur;

    -- Limpa o histórico do msdb também
    EXEC msdb.dbo.sp_delete_backuphistory @oldest_date = @DataCorte;

    PRINT 'Limpeza concluída. Backups anteriores a ' 
        + CONVERT(NVARCHAR(20), @DataCorte, 120) + ' removidos.';
END
GO
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
USE [Levelcode-LevelOS]
GO

-- =============================================
-- Procedure: Limpeza do HISTÓRICO (msdb) +15 dias
-- =============================================
DROP PROCEDURE IF EXISTS [dbo].[sp_LimpezaBackups]
GO

CREATE PROCEDURE [dbo].[sp_LimpezaBackups]
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DataCorte DATETIME = DATEADD(DAY, -15, GETDATE());

    -- Limpa apenas o histórico do msdb (não precisa de xp_cmdshell)
    EXEC msdb.dbo.sp_delete_backuphistory @oldest_date = @DataCorte;

    PRINT 'Histórico de backups anteriores a ' 
        + CONVERT(NVARCHAR(20), @DataCorte, 120) + ' removido do msdb.';
END
GO