Поскольку вы действуете на INSERT
s, попробуйте #inserted
или inserted
в качестве контейнера для вставки значений.
CREATE TRIGGER...
insert into tblProfile (userId, name, age, address, mobileno) (
select N'do-your-concat-here...', name, age, address, mobileno
from inserted
)
Я давно не работал с триггерами, но это должно помочь вам получить то, что вам нужно.
Просим обратить внимание на эту ссылку: Использование вставленных и удаленных таблиц .
Однако у вас уже есть всеинструменты на стороне приложения, поскольку у вас есть информация и возможность работать с информационными данными в памяти.
РЕДАКТИРОВАТЬ # 1
какпередать этот идентификатор второму триггеру?
В этой конкретной ситуации я вижу больше подходящих для обработки с помощью хранимой процедуры, чем два независимых триггера.У нас есть взаимозависимые данные здесь (userId).Я думаю, что самый простой способ - это хранимая процедура.Рекомендуется заключить эти операции в область транзакции, так как если одна из вставок завершится неудачно, обе не будут применены, обеспечивая целостность данных.
CREATE PROCEDURE prcInsProfileUserId
-- Assuming data types. Replace with proper data types as needed.
@name nvarchar(50) NOT NULL
, @age int NOT NULL
, @address nvarchar(150) NOT NULL
, @mobileno bigint NOT NULL
, @role nvarchar(10) NOT NULL
, @status int NOT NULL
AS BEGIN TRANSACTION
DECLARE @UserId nvarchar(10)
SET @UserId = N'do-your-concat-here...';
-- We then have the userId value, so we may insert into both tables accordingly.
insert into tblProfile (userId, name, age, mobileno)
values (@userId, @name, @age, @address, @mobileno)
insert into tblUserId (userId, role, status)
values (@userId, @role, @status)
COMMIT
END
Однако , если вы предпочитаетечтобы перейти к триггерам, альтернативой будет вставить объединенное значение для userId во временную таблицу .Затем у вас должен быть DDL, выглядящий следующим образом:
DECLARE @UserIdTempTable TABLE (
userId nvarchar(10) NOT NULL
)
Затем в первом триггере вам нужно будет установить значение переменной @ userId , чтобы содержать соединенную вами userId , затем используйте его для вставки в tblProfile , затем выполните вторую вставку в @UserIdTempTable.
CREATE TRIGGER...
DECLARE @userId nvarchar(10)
SET @userId = N'do-your-concat-here...'
insert into tblProfile (userId, name, age, address, mobileno) (
select @userId, name, age, address, mobileno
from inserted
)
IF @@ROWCOUNT > 0
BEGIN
delete from @UserIdTempTable -- assuring there is no mistake possible while populating and retrieving the userId
insert into @UserIdTempTable (userId)
values (@userId)
END
END
Затем вы можете выбрать егоот вашего второго триггера.
CREATE TRIGGER second...
insert into tblUserId (userId, role, status) (
select tmp.userId, i.role i.status
from @UserIdTempTable tmp
, inserted i
)
Будьте здесь осторожны, поскольку целостность данных не сохраняется абсолютно, поскольку первая вставка могла быть успешно обработана, а вторая - нет.Чтобы сохранить целостность данных, вам необходимо проверить, больше ли @@ ROWCOUNT 0, если только вы не удалили бы запись с этим фактическим userId из tblProfile .
Это абсолютная тяжелая ручная работа.Обработка через триггеры здесь не рекомендуется, поскольку при вставке tblProfile у вас нет информационных данных, необходимых для tblUserId, поэтому вам нужно иметь два DbCommand
и запускать два ExecuteNonQuery()
подряд.Это очень много для такой крошечной задачи.Тогда было бы удобнее обрабатывать хранимую процедуру, как это было предложено, плюс она обеспечивала целостность данных самой СУБД, а не имитировала ее посредством @@ ROWCOUNT проверки.
Отказ от ответственности: Этот код предоставляется "как есть" и не гарантирует компиляцию без вас, чтобы адаптировать его к вашей ситуации.Я написал это на макушке без проверки.
Надеюсь, это поможет!=)