2014-12-23 2 views
0

Я хочу, чтобы триггер в таблице метаданных CRM срабатывал, когда люди удаляли поля.Как узнать контекст пользователя на триггере

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

Есть ли способ узнать это?

Это триггер:

CREATE TRIGGER Trg_InsertMetadataAttributeDELETE 
    ON metadataschema.Attribute 
    AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO MIGRACIONDATOS.TablaLogAtributos (Fecha, Entidad, Atributo) 
    SELECT Getdate(), E.Name, A.Name 
     FROM Deleted A 
      INNER JOIN metadataschema.Entity E 
       ON A.EntityID = E.EntityID 

END 
GO 

Организация CRM не будет обновлен до UR12 и не может быть повышен

UPDATE: Это не Возможное, если закатать, если ниже 12 .

+0

это не будет пользователь CRMAPP вы видите здесь? – Alex

ответ

2

Манипулирование базой данных CRM любым способом, кроме индексов настройки, не поддерживается Microsoft. Предполагая, что у вас установлен UR12 (если нет, я настоятельно рекомендую вам сделать это как можно скорее), то Microsoft.Xrm.Metadata.Query предоставляет поддерживаемый инструмент.

Retrieve and Detect Changes to Metadata

классов в пространстве имен Microsoft.Xrm.Sdk.Metadata.Query и RetrieveMetadataChangesRequest и классах RetrieveMetadataChangesResponse позволяют создавать эффективные запросы метаданных и изменения в метаданные захвата, как они происходят с течением времени.

[Образцы кода приведены в связанном разделе MSDN]

+0

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

+0

Отредактировал вопрос, чтобы включить эту * важную * информацию. Я оставлю ответ здесь, если кто-то с UR12 приходит с аналогичной потребностью. – Alex

+0

Это правильный ответ, и он невозможен, если сверток уступает 12. Спасибо. – Sxntk

1
See if these help you : All executable in triggers. 

-- get the user name 
SELECT SUSER_SNAME(); 

-- get the event data. Which you can parse and retrieve the event command, scheme, objects.... 
DECLARE @EventData XML; 
    SET @EventData = EVENTDATA(); 
-- Then parse the xml. For example : 
SELECT @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'), 
SELECT @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'), 

-- Get connection specific data 
SELECT * 
FROM sys.dm_exec_connections 
    WHERE session_id = @@SPID; 

-- Get session specific data on whomever executed the process that fired the trigger 
SELECT * 
FROM sys.dm_exec_sessions 
    WHERE session_id = @@SPID; 

смотрите ссылку для использования данныеСобытия(): http://msdn.microsoft.com/en-us/library/ms173781.aspx

+0

Я попробую это. – Sxntk

+0

Здравствуйте, EventData() возвращает null, я думаю, это потому, что это DML-процесс, а не DDL. – Sxntk

+0

Выбор SUSER_NAME() или из sys.dm_exec_sessions будет работать. –

Смежные вопросы