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;)
