【发布时间】:2021-03-25 11:52:12
【问题描述】:
这是我的主表(参考)
CREATE TABLE [ptref].[EarningDecode](
[CountryGroupingCd] [char](2) NOT NULL,
[EarningsCd] [char](4) NOT NULL,
[EarningsDesc] [nchar](25) NULL,
[CreateUserID] [varchar](50) NOT NULL,
[CreateDttm] [datetime] NOT NULL,
[UpdateUserId] [varchar](50) NOT NULL,
[UpdateDttm] [datetime] NOT NULL,
CONSTRAINT [PK_EarningDecode] PRIMARY KEY CLUSTERED
(
[CountryGroupingCd] ASC,
[EarningsCd] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
GO
还有一张桌子
CREATE TABLE [rt].[AdditionalPaymentsRealTime](
[PeopleKey] [int] NOT NULL,
[PersonnelNbr] [varchar](8) NOT NULL,
[SAPStartDt] [datetime] NOT NULL,
[SAPEndDt] [datetime] NOT NULL,
[EarningsCd] [char](4) NOT NULL,
[FlatAmountPaymentAmt] [decimal](13, 2) NULL,
[CurrencyCd] [char](5) NULL,
[PaymentFrequencyCd] [char](3) NULL,
[FrequencyCountNbr] [decimal](3, 0) NULL,
[AdditionalPaymentsNbr] [decimal](7, 2) NULL,
[UnitCd] [char](3) NULL,
[PayrollWageTypeInd] [char](1) NOT NULL,
[RecordTypeInd] [smallint] NOT NULL,
[MRDRExpiryDt] [datetime] NULL,
[SAPChangeDt] [datetime] NULL,
[SAPUpdateUserNm] [varchar](50) NULL,
[DocumentCreateDttm] [datetime] NOT NULL,
[IDOCId] [varchar](40) NOT NULL,
[IDOCCounter] [varchar](40) NOT NULL,
[CreateUserID] [varchar](50) NOT NULL,
[CreateDttm] [datetime] NOT NULL,
[UpdateUserId] [varchar](50) NOT NULL,
[UpdateDttm] [datetime] NOT NULL,
CONSTRAINT [PK_AdditionalPaymentsRealTime] PRIMARY KEY NONCLUSTERED
(
[PeopleKey] ASC,
[PersonnelNbr] ASC,
[SAPStartDt] ASC,
[SAPEndDt] ASC,
[EarningsCd] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
GO
这里的要求是在 rt.AdditionalPaymentsRealTime 中仅记录应插入 EarningsCd in (Select distinct EarningsCd from ptref.EarningDecode) 的位置,对于无效值应抛出错误。
我想出了以下查询,但它似乎不起作用。
CREATE TRIGGER trgrr
ON rt.AdditionalPaymentsRealTime
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON ;
Declare @EarningsCdnew char(4)
Set @EarningsCdnew = (Select EarningsCd from rt.AdditionalPaymentsRealTime)
IF (NOT EXISTS(
SELECT EarningsCd
FROM ptref.EarningDecode
WHERE EarningsCd = @EarningsCdnew))
ROLLBACK TRAN ;
THROW 60000, 'Cannot process invalid EarningsCd', 1 ;
END
有人可以帮忙吗?
【问题讨论】:
-
为什么不使用外键约束?
-
声明
Set @EarningsCdnew = (Select EarningsCd from rt.AdditionalPaymentsRealTime)也假设表rt.AdditionalPaymentsRealTime只能包含一个行;我怀疑这是真的。 -
最后,在
TRIGGER中有一个ROLLBACK是个坏主意。相反,您应该增加THROW的严重性(至少为10),然后调用进程将使用ROLLBACK处理错误和/或输入外部CATCH。将ROLLBACK放入TRIGGER会产生额外的错误。 -
您的 throw 与 IF 语句的 THEN 部分不在同一块内 - 您没有 BEGIN / END 。 INSTEAD-OF 触发器将实际将更改移动到触发器编写器的正确表中的负担 - 您也忽略了这一点。让我们养成良好的习惯。始终使用语句终止符 - 而不是随机使用。
标签: sql sql-server triggers insert