首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在T-SQL / SQL Server中为超/子类型(继承)实体模拟BEFORE INSERT触发器?

如何在T-SQL / SQL Server中为超/子类型(继承)实体模拟BEFORE INSERT触发器?
EN

Stack Overflow用户
提问于 2013-03-17 13:55:45
回答 1查看 119.7K关注 0票数 23

这是在Azure上。

我有一个超类型实体和几个子类型实体,后者需要在每次插入时从超类型实体的主键中获取它们的外键。在Oracle中,我使用BEFORE INSERT触发器来完成此操作。如何在SQL Server / T-SQL中实现这一点?

DDL

代码语言:javascript
复制
CREATE TABLE super (
 super_id int IDENTITY(1,1)
 ,subtype_discriminator char(4) CHECK (subtype_discriminator IN ('SUB1', 'SUB2')
 ,CONSTRAINT super_id_pk PRIMARY KEY (super_id)
);
CREATE TABLE sub1 (
 sub_id int IDENTITY(1,1)
,super_id int NOT NULL
,CONSTRAINT sub_id_pk PRIMARY KEY (sub_id)
,CONSTRAINT sub_super_id_fk FOREIGN KEY (super_id) REFERENCES super (super_id)
);

我希望insert into sub1触发一个触发器,该触发器实际将一个值插入到super中,并使用生成的super_id将其放入sub1中。

在Oracle中,这将通过以下方式完成:

代码语言:javascript
复制
CREATE TRIGGER sub_trg
    BEFORE INSERT ON sub1
    FOR EACH ROW
DECLARE
    v_super_id int; //Ignore the fact that I could have used super_id_seq.CURRVAL
BEGIN
    INSERT INTO super (super_id, subtype_discriminator) 
        VALUES (super_id_seq.NEXTVAL, 'SUB1') 
        RETURNING super_id INTO v_super_id;
    :NEW.super_id := v_super_id;
END;

鉴于T-SQL缺乏BEFORE INSERT功能,请建议我如何在T-SQL中模拟这一点?

EN

回答 1

Stack Overflow用户

发布于 2017-01-13 02:49:26

虽然Andriy的建议适用于少量记录的插入,但全表扫描将在最终的连接上完成,因为'enumerated‘和'@new_super’都没有索引,导致大型插入的性能很差。

这可以通过在@new_super表上指定主键来解决,如下所示:

代码语言:javascript
复制
DECLARE @new_super TABLE (
  row_num INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
  super_id   int
);

这将导致SQL优化器扫描“枚举”表,但在@new_super上执行索引连接以获得新键。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15458006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档