0

SQL Server 2008 R2 を使用すると、次のエラーが発生します。

メッセージ 311、レベル 16、状態 1、プロシージャ ad_user、行 28
「挿入」テーブルと「削除」テーブルでは、text、ntext、または image 列を使用できません。

トリガーの目的は、新しいユーザーが挿入されたときにユーザー グループ テーブルを更新することです。エラーが発生する場所までの SQL のみを含めました。) 私を混乱させるのは、整数宣言の1つを削除しても、同じエラーが発生しないことです(変数を宣言していないというエラーだけです)。

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 に答える