0

使用 SQL Server 2008 R2,我收到错误:

消息 311,级别 16,状态 1,过程 ad_user,第 28 行
不能在“已插入”和“已删除”表中使用 text、ntext 或 image 列。

触发器的目的是在插入新用户时更新用户组表。我只包含了错误发生位置的 SQL。)。让我感到困惑的是,如果我删除其中一个整数声明,我不会得到同样的错误(只是关于没有声明变量的错误)。

CREATE trigger [dbo].[ad_user] on [dbo].[tps_user] 
FOR INSERT
AS

DECLARE @UserGuid uniqueidentifier
DECLARE @EndUserTypeGuid uniqueidentifier
DECLARE @UserTypeGuid uniqueidentifier
DECLARE @saGuid uniqueidentifier
DECLARE @GroupGuid uniqueidentifier
DECLARE @NewUser VarChar(250)
DECLARE @deptnum VarChar(250)
DECLARE @locnum VarChar(250)
DECLARE @CN VarChar(250)
DECLARE @NewOU VarChar(250)
DECLARE @pos1 integer
DECLARE @pos2 integer

BEGIN
SELECT @EndUserTypeGuid=tps_guid FROM tps_user_type WHERE tps_name='EndUser'
SELECT @saGuid = tps_guid FROM tps_user WHERE tps_title = 'SA'

SELECT  @UserGuid=tps_guid, 
        @UserTypeGuid=tps_user_type_guid,
        @NewUser=tps_title,
        @deptnum=usr_departmentnumber,
        @locnum=usr_locationnumber,
        @CN=usr_ou
FROM inserted   

    IF @UserTypeGuid=@EndUserTypeGuid
BEGIN       
  SELECT @GroupGuid=tps_guid FROM tps_group WHERE usr_departmentnumber=@deptnum     
    IF @GroupGuid IS NOT NULL
    BEGIN
      IF @UserGuid NOT IN (SELECT tps_user_id 
             FROM tps_user_group WHERE tps_group_id = @GroupGuid) 
      BEGIN
    -- Remove the user from other groups
    DELETE FROM tps_user_group WHERE tps_user_id = @UserGuid;                       
    -- Create Customer Group Membership from department
        INSERT INTO tps_user_group(tps_user_id, tps_group_id, tps_creation_user_guid, 
              tps_last_update_user_guid, tps_creation_date, tps_last_update)
    VALUES(@UserGuid, @GroupGuid, @saGuid, @saGuid, GetDate(), GetDate());
          END
        END
    END
END        
4

1 回答 1

0

我已经对此进行了测试,当您在/伪表中显式引用此类列时,此错误消息将在编译时出现,而不是在运行时出现。不幸的是,我认为您必须更正基础表中的这些列才能使用它们,因为您不能只对.inserteddeletedinserted

是什么阻止了客户端升级这些列以使用自 SQL Server 2005 以来由于许多充分理由(包括这个)而未被弃用的适当的一流数据类型?

无论如何,您都需要重新编写触发器。它目前不是多行安全的。一旦您纠正了数据类型,触发器就不会中断,它只会从中选择任意行inserted并忽略其余行。所以它需要被inserted视为一个集合,而不是单行,因为 SQL Server 中的触发器是按语句触发的,而不是按行触发的。

于 2012-07-23T16:27:58.277 回答