DBASQL Server

Ochrana databáze před smazáním

Občas se zkrátka a dobře nedá vždy zabránit tomu, že přijde seshora příkaz, aby ten a ten dostal admin práva na produkci. Jako správný paranoidní DBA to ale nenecháte jen tak a pojistíte si alespoň ten nejhorší možný scénář: že se vetřelec, ať už omylem nebo úmyslně, pokusí smazat jednu nebo více klíčových produkčních databází.

Jak na to? Jednoduše pomocí DDL triggeru na úrovni serveru, ve kterém odchytíme událost DROP_DATABASE a po vypsání informační zprávy provedeme ROLLBACK operace:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [trg_DDL_DropDatabasePreventer]
ON ALL SERVER
FOR DROP_DATABASE
AS
BEGIN

    DECLARE @DbName varchar(128)
    SELECT @DbName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)')

    IF @DbName IN ('ProdDB')
    BEGIN
        PRINT 'Production database ' + @DbName + ' cannot be dropped!'
        PRINT 'Run >> DISABLE TRIGGER trg_DDL_DropDatabasePreventer ON ALL SERVER << first.'
        PRINT 'Reenable!!! the trigger with >> ENABLE TRIGGER trg_DDL_DropDatabasePreventer 
                  ON ALL SERVER <<'
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
    END

END
GO

ENABLE TRIGGER [trg_DDL_DropDatabasePreventer] ON ALL SERVER
GO

Záleží jen na Vaší fantazii, jak peprná ona informační zpráva bude a zda tam třeba ještě pro větší zábavu nepřihodíte volání sp_send_dbmail na nadřízeného;)

Leave a Reply

Your email address will not be published. Required fields are marked *