【问题标题】:How create INSTEAD OF INSERT trigger如何创建 INSTEAD OF INSERT 触发器
【发布时间】:2011-11-10 07:34:21
【问题描述】:

我创建触发器

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。 并在@Key中设置sp_GeneratePassword 5(过程)。

如何做到这一点?

更新

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”。

【问题讨论】:

  • 有错误Declare @Key nvar char(10); 应该是Declare @Key nvarchar(10);(没有空格)但无论如何它都不会工作。检查我的答案,但请记住,一次插入所有记录时,它会为所有记录设置相同的密码。

标签: sql sql-server stored-procedures triggers


【解决方案1】:

除了 Michal Powaga 记录的信息和以下信息外,触发器看起来还不错:

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。

我会使用昨天的答案中的输出参数:Returning a value from a stored procedure

注意;您正在为 INSERT 中的所有行分配相同的密码(不要假设触发器对单行进行操作)。我会考虑在调用 UDF 的 KeyInvitation 列上使用 DEFAULT 约束。这样可以避免触发并给出不同的值(我假设)

【讨论】:

  • @Deniska d:我的评论说我无法在工作中使用我的浏览器发布上面的工作 nvarchar。不要盲目复制/粘贴
【解决方案2】:

你为什么不插入@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 解释后更改

你的 SP:

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

..then 触发器如下所示:

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

【讨论】:

  • 这应该可行,但如果插入了一批记录,每个人都会使用相同的密码。
  • 是的,但@Deniskad 可能无意使用它一次插入多条记录。 Declare @Key nvarchar(10); EXEC @Key = sp_GeneratePassword 5;@Key 用于“所有”记录表明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2021-12-24
  • 2015-01-23
  • 2017-11-26
相关资源
最近更新 更多