Триггер ввода SQL Server для триггера Azure - PullRequest
0 голосов
/ 01 декабря 2011

Я только что перенес одну из своих страниц в учетную запись Windows Azure.Все прошло гладко .. пока я не попытался создать некоторые данные.Мой триггер, который работал нормально с MSSQL2008, не работает на Azure - как я могу исправить этот триггер:

CREATE TRIGGER creator
ON someTable
FOR INSERT
AS
DECLARE @someTableID INT;
SELECT @someTableID=(SELECT someTableID FROM INSERTED)
INSERT INTO Preisgruppe ( Name, someTableID, UserPreisgruppe_ID ) VALUES ( 'Gast',     @someTableID, 1)
INSERT INTO Oeffnungszeit ( someTableID, Tag_ID, von,bis) VALUES ( @someTableID, 0,     '00:00','00:00'),( @someTableID, 1, '00:00','00:00'),( @someTableID, 2, '00:00','00:00'),(     @someTableID, 3, '00:00','00:00'),( @someTableID, 4, '00:00','00:00'),( @someTableID, 5,     '00:00','00:00'),( @someTableID, 6, '00:00','00:00')
GO

Ответы [ 2 ]

0 голосов
/ 09 июня 2015

Просто приведу другой пример, вот что я использую ...

ОПРЕДЕЛЕНИЕ ТАБЛИЦЫ:
Это обычная таблица, за исключением того, что «основная часть» полей AUDIT находится в таблице HISTORY.

CREATE TABLE [data].[Categories](
    [Id] [uniqueidentifier] NOT NULL DEFAULT (newid()),
    [Name] [nvarchar](250) NOT NULL,
    [Description] [nvarchar](500) NULL,
    [DisplayOrder] [bigint] NULL,
    [ProductCount] [bigint] NULL,
    [IsActive] [bit] NOT NULL CONSTRAINT [DF_Categories_IsActive]  DEFAULT ((1)),
    [UpdatedBy] [nvarchar](360) NOT NULL
)

На заметку ...

  • Таблицы кучи не допускаются, поэтому каждый столбец «Id» ОБЯЗАТЕЛЬНО должен быть
  • Вы также должны привыкнуть к использованию GUID для ваших ПЕРВИЧНЫХ КЛЮЧЕЙ

ОПРЕДЕЛЕНИЕ ТАБЛИЦЫ ИСТОРИИ (используется для целей аудита):
Эта таблица используется для целей AUDIT. Вы по-прежнему узнаете, кто что сделал и когда, за исключением того, что история не спрятана в вашей главной таблице и не замедлит ваши ИНДЕКСЫ. И ... вы получаете НАСТОЯЩИЙ АУДИТ за пределы простой доставки журналов.

CREATE TABLE [history].[data_Categories](
    [Id] [uniqueidentifier] NOT NULL DEFAULT (newid()),
    [EntityId] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](250) NOT NULL,
    [Description] [nvarchar](500) NULL,
    [ProductCount] [bigint] NULL,
    [DisplayOrder] [bigint] NULL,
    [IsActive] [bit] NOT NULL,
    [UpdatedBy] [nvarchar](360) NOT NULL,
    [UpdateType] [nvarchar](50) NOT NULL,
    [UpdatedDate] [datetime] NOT NULL
)

GO

ALTER TABLE [history].[data_Categories] ADD  CONSTRAINT [DF_data_Categories_31EC6D26]  DEFAULT (newid()) FOR [Id]
GO

ALTER TABLE [history].[data_Categories] ADD  CONSTRAINT [DF_data_Categories_32E0915F]  DEFAULT (getutcdate()) FOR [UpdatedDate]
GO

ALTER TABLE [history].[data_Categories] ADD  DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [EntityId]
GO

На заметку ...

  • Вы также можете отключить TRIGGERS в хранимых процедурах DELETE, чтобы сделать AUDIT «чище»
  • Причина, по которой он становится "чище", заключается в том, что вы получаете одну запись DELETE AUDIT вместо записи UPDATE & DELETE AUDIT
  • Для этого просто выключите ТРИГГЕР до УДАЛЕНИЯ ЗАЯВЛЕНИЯ и снова включите его.

TIGLE TRIGGER:
Просто нормальный триггер ...

CREATE TRIGGER [data].[trig_Categories] 
   ON  [data].[Categories]
   AFTER INSERT, DELETE, UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @Id INT
    DECLARE @Type VARCHAR(20);

    IF EXISTS(SELECT * FROM INSERTED)
        BEGIN
            IF EXISTS(SELECT * FROM DELETED)
                BEGIN
                    SET @Type ='UPDATED';
                END
            ELSE
                BEGIN
                    SET @Type ='INSERTED';
                END


            INSERT INTO 
                history.data_Categories (
                    [EntityId]
                    ,[Name]
                    ,[Description]
                    ,[DisplayOrder]
                    ,[ProductCount]
                    ,[IsActive]
                    ,[UpdatedBy]
                    ,[UpdateType])
            SELECT 
                    [Id]
                    ,[Name]
                    ,[Description]
                    ,[DisplayOrder]
                    ,[ProductCount]
                    ,[IsActive]
                    ,[UpdatedBy]
                    ,@Type
            FROM INSERTED

        END
    ELSE
        BEGIN
            SET @type = 'DELETED';


            INSERT INTO 
                history.data_Categories (
                    [EntityId]
                    ,[Name]
                    ,[Description]
                    ,[DisplayOrder]
                    ,[ProductCount]
                    ,[IsActive]
                    ,[UpdatedBy]
                    ,[UpdateType])
            SELECT 
                    [Id]
                    ,[Name]
                    ,[Description]
                    ,[DisplayOrder]
                    ,[ProductCount]
                    ,[IsActive]
                    ,[UpdatedBy]
                    ,@Type          
            FROM DELETED
        END;
END

GO
0 голосов
/ 08 февраля 2012

Ничего не выглядит плохо в этом триггере. Я попробовал ваш код, и он работает нормально. Так что это может быть структура. Мой вид выглядит так:

CREATE TABLE [dbo].[someTable](
    [someTableID] [int] IDENTITY(1,1) NOT NULL,
    [Column1] [nvarchar](50) NOT NULL
)

CREATE TABLE [dbo].[Preisgruppe](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [someTableID] [int] NULL,
    [UserPreisgruppe_ID] [int] NULL
)

CREATE TABLE [dbo].[Oeffnungszeit](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [someTableID] [int] NOT NULL,
    [Tag_ID] [int] NOT NULL,
    [von] [time](7) NULL,
    [bis] [time](7) NULL
)

Также было бы неплохо иметь сообщение об ошибке ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...