if 语句中的 SQL 触发器

时间:2021-06-15 16:47:22

标签: sql sql-server-2008 ssms

我收到这些错误:

<块引用>

消息 156,级别 15,状态 1,第 37 行
关键字“TRIGGER”附近的语法不正确。

消息 140,级别 15,状态 1,第 44 行
只能在 CREATE TRIGGER 语句中使用 IF UPDATE。

我不明白我在做什么,在这里创建触发器的代码在 IF 语句之外运行良好,但是一旦我将它放入语句中,我就无法运行它。是否有一些我搞砸的语法或类似的东西?当我将鼠标悬停在列上时,我收到一条消息,显示无效的列名,这对我来说没有意义,因为在没有 IF 语句的情况下,我的代码运行良好。

enter image description here

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

0 个答案:

没有答案