使用SQL Server 2008 R2,我收到错误:
Msg 311,Level 16,State 1,Procedure ad_user,Line 28
不能在'inserted'和'deleted'表中使用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
答案 0 :(得分:0)
我已对此进行了测试,当您显式引用 inserted
/ deleted
伪的列中的时,此错误消息将在编译时发生,而不是在运行时表。不幸的是,我认为你必须更正基础表中的这些列才能使用它们,因为你不能只对inserted
中的列应用转换。
什么阻止客户端升级这些列以使用尚未deprecated since SQL Server 2005的正确的一流数据类型,原因很多(包括这个)?
无论如何,你需要重新编写你的触发器。它目前不是多排安全的。一旦修正了数据类型,触发器就不会中断,它只会从inserted
中选择一个任意行而忽略其余的行。因此,它需要将inserted
视为一个集合,而不是单行,因为SQL Server中的触发器会触发每个语句,而不是每行。