Navision - советы и секреты

  Все выпуски  

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


Верно, многие уже и не помнят, когда в последний раз выходила эта рассылка. А вот, не прошло и десяти лет, как новый выпуск.

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

Всего-то надо:

1.       добавить в таблицу dbo.Object одно поле – Last Changed By.

2.       На саму таблицу повесить триггер, который будет заполнять это поле:

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

 

Дополнительно нам понадобятся еще функции, возвращающие логин текущего пользователя, и время-дату. Уверен, что у многих запасливых они уже есть, а если нет – их можно взять на www.naviart.ru.

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

И, конечно, не забываем про права, в том числе на распределенные по серверам запросы.

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

 

 

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 часа получаемого письма с результатами данных инквизиторских запросов. В норме письма должны быть пустыми.

Наличие строк в данных запросах – симптом искривления рук и требует немедленного лечения самыми суровыми методами.

Полная версия статьи с приложением изрядного количества кода  – на сайте www.naviart.ru – появится в самое ближайшее время.

 


В избранное