Создание триггера из представления SQL - PullRequest
0 голосов
/ 26 мая 2019

У меня есть две таблицы, которые обновляются одной функцией (GLPOST и GLPOSTO).

Я создал представление (GLREP) на основе этих двух таблиц, которые транспонируют строки GLPOSTO в столбцы, так как я хочу, чтобы мои данные.

Теперь я хочу создать триггер (OPTIONAL) для этого представления для вставки в новую таблицу (GLREPORTEXCEL), как только представление соберетданные из различных таблиц в формате представления.

Представление GLREP:

CREATE VIEW [dbo].[GLREP] 
AS 
    (SELECT * 
     FROM 
         (SELECT  
              GLPOST.ACCTID,
              JRNLDATE, 
              GLPOST.FISCALYR, 
              GLPOST.FISCALPERD, 
              GLPOST.SRCECURN, 
              GLPOST.BATCHNBR,
              GLPOST.ENTRYNBR, 
              GLPOST.JNLDTLDESC, 
              GLPOST.JNLDTLREF, 
              GLPOST.TRANSAMT,
              GLPOST.CONVRATE,
              GLPOST.SCURNAMT, 
              GLPOSTO.OPTFIELD,
              GLPOST.CNTDETAIL,  
              CSOPTFD.VDESC 
          FROM 
              GLPOST 
          LEFT JOIN 
              GLPOSTO ON GLPOST.ACCTID = GLPOSTO.ACCTID 
                      AND GLPOST.POSTINGSEQ = GLPOSTO.POSTINGSEQ 
                      AND glpost.CNTDETAIL = glposto.CNTDETAIL 
          LEFT JOIN 
              CSOPTFD ON GLPOSTO.OPTFIELD = CSOPTFD.OPTFIELD 
                      AND GLPOSTO.VALUE = CSOPTFD.VALUE) AS source 
     PIVOT
          (MAX([VDESC]) 
              FOR [OPTFIELD] IN (ADVANCE, MEDICAL, MILEAGE, MOTORVEHICLE, PROMOTION, STAFF)) AS PVT 
           )

Мой триггер, который не работает:

CREATE TRIGGER OPTIONAL
ON GLREP
FOR INSERT
AS
    INSERT INTO GLREPORTEXCEL (ACCTID, TRANDATE, FISCALYR, FISCALPERD, SRCECURN, BATCHNBR, 
                               ENTRYNBR, JNLDTLDESC, JNLDTLREF, TRANSAMT, CONVRATE, SCURNAMT, 
                               CNTDETAIL, STAFF, ADVANCE, MEDICAL, MILEAGE, MOTORVEHICLE, PROMOTION)
        SELECT 
            ACCTID, JRNLDATE, FISCALYR, FISCALPERD, SRCECURN, BATCHNBR, 
            ENTRYNBR, JNLDTLDESC, JNLDTLREF, TRANSAMT, CONVRATE, SCURNAMT, 
            CNTDETAIL, STAFF, ADVANCE, MEDICAL, MILEAGE, MOTORVEHICLE, PROMOTION 
        FROM 
            inserted

Новая таблица, которую яхотите вставить в называется GLREPORTEXCEL.

1 Ответ

0 голосов
/ 27 мая 2019

Как я намекал и специально писал Марк в комментариях, SQL Server не поддерживает for триггеры для представлений - только instead of триггеры.

Это описано на странице CREATE TRIGGER (Transact-SQL) , в параграфе Аргументы:

таблица | вид
Таблица или представление, в котором выполняется триггер DML. Эта таблица или представление иногда упоминается как таблица триггеров или представление триггеров. Указывать полное имя таблицы или представления необязательно. Вы можете ссылаться на представление только с помощью триггера INSTEAD OF. Нельзя определить триггеры DML для локальных или глобальных временных таблиц.

(выделено мое).

Это означает, что вам нужно изменить триггер с for на триггер instead of:

CREATE TRIGGER OPTIONAL
ON GLREP
INSTEAD OF INSERT
AS
    INSERT INTO GLREPORTEXCEL (ACCTID, TRANDATE, FISCALYR, FISCALPERD, SRCECURN, BATCHNBR, 
                               ENTRYNBR, JNLDTLDESC, JNLDTLREF, TRANSAMT, CONVRATE, SCURNAMT, 
                               CNTDETAIL, STAFF, ADVANCE, MEDICAL, MILEAGE, MOTORVEHICLE, PROMOTION)
        SELECT 
            ACCTID, JRNLDATE, FISCALYR, FISCALPERD, SRCECURN, BATCHNBR, 
            ENTRYNBR, JNLDTLDESC, JNLDTLREF, TRANSAMT, CONVRATE, SCURNAMT, 
            CNTDETAIL, STAFF, ADVANCE, MEDICAL, MILEAGE, MOTORVEHICLE, PROMOTION 
        FROM 
            inserted
...