SQL-триггер внутри оператора if

#sql #sql-server-2008 #ssms

Вопрос:

Я получаю эти ошибки:

Msg 156, Уровень 15, Состояние 1, Строка 37
Неправильный синтаксис рядом с ключевым словом «ТРИГГЕР».

Msg 140, Уровень 15, Состояние 1, Строка 44
Может использоваться только при обновлении в инструкции CREATE TRIGGER.

Я не понимаю, что я здесь делаю, код, создающий триггер, отлично работает вне оператора IF, но как только я помещаю его в оператор, я не могу его запустить. есть ли какой-то синтаксис, который я путаю, или что-то в этом роде? когда я навожу курсор на столбцы, я получаю сообщение с недопустимым именем столбца, которое для меня не имеет смысла, потому что у меня этот код нормально работал без оператора IF.

введите описание изображения здесь

 USE [Elearn2]
GO

IF  NOT EXISTS (SELECT * FROM sys.objects 
                WHERE object_id = OBJECT_ID(N'AspNetUserEmailAudit') 
                  AND type IN (N'U'))
BEGIN
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON

    CREATE TABLE [dbo].[AspNetUserEmailAudit]
    (
        [AuditId] [uniqueidentifier] NOT NULL,
        [AuditDate] [datetime] NOT NULL,
        [UserId] [uniqueidentifier] NOT NULL,
        [UserName] [nvarchar](256) NULL,
        [Email] [nvarchar](256) NULL,
        [NormalizedEmail] [nvarchar](256) NULL,
        [FirstName] [nvarchar](max) NULL,
        [LastName] [nvarchar](max) NULL,

        CONSTRAINT [PK_AspNetUserEmailAudit] 
            PRIMARY KEY CLUSTERED ([AuditId] ASC)
                        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                              IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                              ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    ALTER TABLE [dbo].[AspNetUserEmailAudit] 
        ADD DEFAULT (NEWID()) FOR [AuditId]

    ALTER TABLE [dbo].[AspNetUserEmailAudit] 
        ADD DEFAULT (GETDATE()) FOR [AuditDate]
END

IF NOT EXISTS (SELECT * FROM sys.triggers WHERE name = 'MyTrigger')
BEGIN
    CREATE TRIGGER AspNetUsersEmail_trigger
    ON AspNetUsers
    AFTER UPDATE 
    AS
        ****Error starts***
        SET NOCOUNT ON;

        IF (UPDATE(Email))
            INSERT INTO [dbo].[AspNetUserEmailAudit]
                   (UserId, UserName, Email, NormalizedEmail, FirstName, LastName)
                SELECT Id, UserName, Email, NormalizedEmail, FirstName, LastName
                FROM inserted i
                WHERE EXISTS (SELECT i.Id, i.Email   
                              EXCEPT
                              SELECT d.Id, d.Email
                              FROM deleted d);
    *****
END
GO  

IF NOT EXISTS (SELECT * FROM [dbo].[AspNetRoles] 
               WHERE [NormalizedName] = 'SUPERADMIN')
BEGIN
    INSERT INTO [dbo].[AspNetRoles] ([Id], [Name], [NormalizedName], [ConcurrencyStamp])
    VALUES (NEWID(), 'SuperAdmin', 'SUPERADMIN', NULL)  
END

DECLARE @userrole nvarchar(256)

SET @userrole = (SELECT [RoleId] 
                 FROM [Elearn2].[dbo].[AspNetUserRoles] 
                 WHERE [UserId] = 'E96380FB-1823-453C-9436-08D92532AE7D')

PRINT @userrole

DECLARE @user nvarchar(256)

SET @user = (SELECT [Id] FROM [Elearn2].[dbo].[AspNetUsers] 
             WHERE [UserName] = 'super')
PRINT @user

UPDATE [Elearn2].[dbo].[AspNetUserRoles]
SET [RoleId] = @userrole
WHERE [UserId] = @user
 

Комментарии:

1. В соответствии с точным руководством » CREATE TRIGGER должно быть первым утверждением в пакете». Вы не сможете этого сделать IF NOT EXISTS ... CREATE TRIGGER , если не завернете все создание триггера в EXEC .

2. Поместите все CREATE TRIGGER утверждение в a EXECUTE sp_executesql N'<your create trigger statement here>' .

3. @TT Я все еще получаю ошибки, когда я выполняю это внутри выполнения

4. @JeroenMostert могу ли я поместить его в ЕСЛИ СУЩЕСТВУЕТ? или это та же самая проблема? Я попробовал EXEC, и, похоже, с теми же ошибками

5. @JeroenMostert Извините, я использовал неправильный синтаксис, теперь он работает