Как поймать умников, распускающих руки на боевой базе Navision

Программист, ты стал совсем взрослый.
У тебя уже растут руки.

Сегодня мы займемся тем, что отловим и накажем умников, которые ведут разработку в боевой базе, либо правят ее наживую, либо делают еще что-нибудь нехорошее. До недавнего времени контроль за ними был затруднен. Однако, решение есть всегда.
Всего-то надо:

  • добавить в таблицу dbo.Object одно поле – Last Changed By.
  • На саму таблицу повесить триггер, который будет заполнять это поле:
    CREATE TRIGGER [dbo].[Trg_Object_Change]
       ON  [dbo].[Object]
       AFTER INSERT, UPDATE

    AS
    BEGIN
          SET NOCOUNT ON;

          UPDATE t1
          SET [LAST Changed BY] = dbo.UDF_User_Name()
          FROM dbo.Object t1
                INNER JOIN inserted t2
                ON t1.ID = t2.ID AND t1.TYPE = t2.TYPE AND t1.[Company Name] = t2.[Company Name]
    END

Дополнительно нам понадобятся еще функции, возвращающие логин текущего пользователя — dbo.UDF_User_Name(), и время-дату dbo.UDF_Date_Time().

Изменения надо сделать во всех базах – и в разработке, и в тестовой, и во всех продуктовых. И, конечно, не забываем про права, в том числе на распределенные по серверам запросы.

А дальше преступника можно легко поймать с помощью вот такого скрипта:

CREATE PROCEDURE dbo.Proc_Check_Forbidden_Development
AS

SET NOCOUNT ON
SELECT TYPE, ID, [Company Name], Name, Modified, Compiled,
dbo.UDF_Date_Time(DATE,TIME) AS Full_Date, [LAST Changed BY] AS Good_User
INTO #DEV
FROM [DEVSERVER].[DEVBASE].dbo.[Object] t1
WHERE TYPE <> 1
ORDER BY TYPE, ID, Name

SELECT TYPE, ID, [Company Name], Name, Modified, Compiled,
dbo.UDF_Date_Time(DATE,TIME) AS Full_Date, [LAST Changed BY] AS Victim
INTO #PRODUCT
FROM [PRODUCTSERVER].[PRODUCTBASE].dbo.[Object] t1
WHERE TYPE <> 1
ORDER BY TYPE, ID, Name

--  Объекты в боевой базе, которые свежее разработки
SELECT t1.*, t2.Full_Date AS Dev_Date, t2.Modified AS Dev_Modified
FROM #PRODUCT t1 (nolock)
    LEFT JOIN #DEV t2 (nolock)
    ON t1.[ID] = t2.[ID] AND t1.TYPE = t2.TYPE
WHERE t1.Full_Date > t2.Full_Date

-- Объекты, присутствующие только в боевой базе
SELECT t1.*
FROM #PRODUCT t1 (nolock)
    LEFT JOIN #DEV t2 (nolock)
    ON t1.[ID] = t2.[ID] AND t1.TYPE = t2.TYPE
WHERE t2.ID IS NULL

-- Далее – насколько хватит вашей фантазии

Вот в таком аспекте.
Лично у меня это работало в виде ежедневного, раз в 4 часа получаемого письма с результатами данных инквизиторских запросов. В норме письма должны быть пустыми.
Наличие строк в данных запросах – симптом искривления рук и требует немедленного лечения самыми суровыми методами.

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Добавить комментарий