#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
утверждение в aEXECUTE sp_executesql N'<your create trigger statement here>'
.3. @TT Я все еще получаю ошибки, когда я выполняю это внутри выполнения
4. @JeroenMostert могу ли я поместить его в ЕСЛИ СУЩЕСТВУЕТ? или это та же самая проблема? Я попробовал EXEC, и, похоже, с теми же ошибками
5. @JeroenMostert Извините, я использовал неправильный синтаксис, теперь он работает