Как создать триггер INSTEAD OF INSERT - PullRequest
0 голосов
/ 10 ноября 2011

Я создаю триггер

CREATE TRIGGER PartnersTrigger on Partners
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON


Declare @Key nvarchar(10);

EXEC @Key = sp_GeneratePassword 5;

UPDATE Partners SET KeyInvitation  = @Key WHERE Id IN (SELECT Id FROM inserted);
INSERT INTO Partners(Email,KeyInvitation)
   SELECT Email, KeyInvitation
FROM inserted
END
GO

Но мне нужно установить KeyInvitation переменная @Key. И установите sp_GeneratePassword 5 (процедура) в @Key.

Как это сделать?

UPDATE

CREATE PROCEDURE sp_GeneratePassword
 (
     @Length int
 )

 AS

 DECLARE @RandomID varchar(32)
 DECLARE @counter smallint
 DECLARE @RandomNumber float
 DECLARE @RandomNumberInt tinyint
 DECLARE @CurrentCharacter varchar(1)
 DECLARE @ValidCharacters varchar(255)
 SET @ValidCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789'
 DECLARE @ValidCharactersLength int
 SET @ValidCharactersLength = len(@ValidCharacters)
 SET @CurrentCharacter = ''
 SET @RandomNumber = 0
 SET @RandomNumberInt = 0
 SET @RandomID = ''

 SET NOCOUNT ON

 SET @counter = 1

 WHILE @counter < (@Length + 1)

 BEGIN

         SET @RandomNumber = Rand()
         SET @RandomNumberInt = Convert(tinyint, ((@ValidCharactersLength - 1) * @RandomNumber + 1))

         SELECT @CurrentCharacter = SUBSTRING(@ValidCharacters, @RandomNumberInt, 1)

         SET @counter = @counter + 1

         SET @RandomID = @RandomID + @CurrentCharacter

 END

 SELECT @RandomID  AS 'Password'



GO

это не работает:

Declare @Key nvar char(10);  -- can't post when I use "nvarchar" here
EXEC @Key = sp_GeneratePassword 5;

Ошибка:

Неверный синтаксис рядом с 'char'. Необходимо объявить скалярную переменную "@Key". Необходимо объявить скалярную переменную "@Key". Должен объявить скаляр переменная "@Key".

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

Триггер выглядит нормально, за исключением информации, отмеченной Михалом Повага и этим битом:

Declare @Key nvarchar(10);  -- can't post when I use "nvarchar" here
EXEC @Key = sp_GeneratePassword 5;

Если sp_GeneratePassword не имеет RETURN с определенным значением, оно обычно дает 0, потому что этот тип вызова присваивает значение от RETURN до @Key. Однако это может использоваться только для значений int, а @Key - это nvarchar.

Я бы использовал выходной параметр, как в этом ответе вчера: Возвращение значения из хранимой процедуры

Примечание; Вы присваиваете всем строкам в INSERT один и тот же пароль (не думайте, что триггеры работают с отдельными строками). Я бы рассмотрел ограничение DEFAULT для столбца KeyInvitation, который вызывает UDF. Это позволяет избежать триггера и даст разные значения (я полагаю)

1 голос
/ 10 ноября 2011

Почему бы вам не вставить @Key, как описано ниже:

Редактировать : изменено после @gbn ответа

Во-первых, SP должен выглядеть следующим образом (все о output значении):

CREATE PROCEDURE sp_GeneratePassword 
    @param_in INT, @key_out NVARCHAR(10) OUTPUT
AS
BEGIN
    -- here is your password generation
    SET @key_out = 'your result'
END
GO

Обновление : изменено после объяснения @Deniskad

Ваш ИП:

CREATE PROCEDURE sp_GeneratePassword @Length int, @RandomID varchar(32) OUTPUT
AS
    DECLARE @counter smallint,
        @RandomNumber float,
        @RandomNumberInt tinyint,
        @CurrentCharacter varchar(1),
        @ValidCharacters varchar(255),
        @ValidCharactersLength int

    SET @ValidCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789'

    SELECT @ValidCharactersLength = len(@ValidCharacters),
        @CurrentCharacter = '',
        @RandomNumber = 0,
        @RandomNumberInt = 0,
        @RandomID = ''

    SET NOCOUNT ON

    SET @counter = 1

    WHILE @counter < (@Length + 1)

    BEGIN
        SET @RandomNumber = Rand()
        SET @RandomNumberInt = Convert(tinyint, ((@ValidCharactersLength - 1) * @RandomNumber + 1))

        SELECT @CurrentCharacter = SUBSTRING(@ValidCharacters, @RandomNumberInt, 1)

        SET @counter = @counter + 1

        SET @RandomID = @RandomID + @CurrentCharacter
    END
GO

.. тогда триггер будет выглядеть так:

CREATE TRIGGER PartnersTrigger on Partners
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON
    Declare @Key nvarchar(10);

    EXEC sp_GeneratePassword 5, @Key OUTPUT

    INSERT INTO Partners(Email,KeyInvitation)
    SELECT Email, @Key
    FROM inserted
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...