使用视图代替 INSERT 触发器和标识列

2023-12-04

我正在构建一个数据库来存储公司的客户数据。数据库中的表已标准化,因此我有多个使用外键约束链接在一起的表。

Microsoft Access 将用于与数据库交互(作为前端)。为了使事情变得更简单,我创建了一个视图,将所有必需的表连接在一起,以便最终用户可以轻松查询信息。

我遇到的问题涉及将信息插入到该视图中。根据我的理解,由于我的视图中有多个表,因此我必须使用带有INSTEAD OF INSERT陈述。我已经创建了触发器;但是,我不确定如何与ID表中的列(这些充当键)。

我有一个MemberBasicInformation包含客户的出生日期、姓名、性别等及其会员 ID 的表。这ID is an IDENTITY表中的列,因此它是自动生成的。我遇到的问题是,因为身份是自动生成的,所以我无法获取插入后生成的身份值MemberBasicInformation表并将其插入到其他相关表中。当我尝试这样做时,我最终会违反外键约束。

我尝试过使用@@Identity and Scope_Identity()无济于事。我列出了我的观点和触发器,让您了解事情是如何设置的。如果有人能指出我正确的方向,我将不胜感激。我真的很茫然。

MEMBER view:

CREATE VIEW [dbo].[Member]
AS
    SELECT        
        dbo.MemberBasic.MemberId, dbo.MemberBasic.FirstName, 
        dbo.MemberBasic.MiddleInitial, dbo.MemberBasic.LastName, 
        dbo.MemberBasic.FullName, dbo.MemberBasic.DateOfBirth, 
        dbo.Gender.Name AS Gender, dbo.MemberBasic.Address, 
        dbo.MemberBasic.Address2, dbo.MemberBasic.City, 
        dbo.MemberBasic.State, dbo.MemberBasic.ZipCode, 
        dbo.MemberBasic.PhoneNumber, 
        dbo.MemberBasic.SocialSecurityNumber, 
        dbo.MemberBasic.DriversLicense, 
        dbo.MemberBasic.EmployerIdentificationNumber, 
        dbo.MemberBasic.Notes, 
        dbo.FieldRep.Name AS FieldRepName, 
        dbo.MemberDetail.DateAssigned AS FieldRepDateAssigned, 
        dbo.MemberDetail.CPReceivedOn, dbo.MemberDetail.CredentialedOn, 
        dbo.MemberEligibility.IsActive, dbo.ICO.Name AS ICO, 
        dbo.MemberEligibility.StartDate AS EligibilityStartDate, 
        dbo.MemberEligibility.EndDate AS EligibilityEndDate, 
        dbo.MemberWorkerCompDetail.ExpirationDate AS WorkerCompExpirationDate, 
        dbo.MemberWorkerCompDetail.AuditDate AS WorkerCompAuditDate, 
        dbo.WorkerCompTier.Name AS WorkerCompTier, 
        dbo.MemberAttachment.AttachmentId, 
        dbo.MemberAttachment.Data AS AttachmentData
    FROM            
        dbo.MemberAttachment 
    INNER JOIN
        dbo.MemberBasic ON dbo.MemberAttachment.MemberId = dbo.MemberBasic.MemberId 
    INNER JOIN
        dbo.MemberCaregiverAssignment ON dbo.MemberAttachment.MemberId = dbo.MemberCaregiverAssignment.MemberId 
    INNER JOIN
        dbo.MemberDetail ON dbo.MemberBasic.MemberId = dbo.MemberDetail.MemberId 
    INNER JOIN
        dbo.MemberEligibility ON dbo.MemberAttachment.MemberId = dbo.MemberEligibility.MemberId 
    INNER JOIN
        dbo.MemberWorkerCompDetail ON dbo.MemberAttachment.MemberId = dbo.MemberWorkerCompDetail.MemberId 
    INNER JOIN
        dbo.Gender ON dbo.MemberBasic.GenderId = dbo.Gender.GenderId 
    INNER JOIN
        dbo.FieldRep ON dbo.MemberDetail.FieldRepId = dbo.FieldRep.FieldRepId 
    INNER JOIN
        dbo.ICO ON dbo.MemberEligibility.ICOId = dbo.ICO.ICOId 
    INNER JOIN
        dbo.WorkerCompTier ON dbo.MemberWorkerCompDetail.TierId = dbo.WorkerCompTier.TierId
GO

MEMBER扳机:

ALTER TRIGGER [dbo].[InsertNewMember] 
ON [dbo].[Member] 
INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO MemberBasic (FirstName, MiddleInitial, LastName, GenderId, DateOfBirth, Address, Address2, City, State, ZipCode, PhoneNumber, SocialSecurityNumber, DriversLicense, EmployerIdentificationNumber, Notes)
        SELECT 
            FirstName, MiddleInitial, LastName, GenderId, DateOfBirth, 
            Address, Address2, City, State, ZipCode, PhoneNumber, 
            SocialSecurityNumber, DriversLicense, 
            EmployerIdentificationNumber, Notes 
        FROM 
            inserted
        INNER JOIN
            Gender ON Gender.Name = Gender; 

    INSERT INTO MemberDetail (MemberId, FieldRepId, DateAssigned, CPReceivedOn, CredentialedOn)
        SELECT 
            MemberId, FieldRep.FieldRepId, FieldRepDateAssigned, 
            CPReceivedOn, CredentialedOn
        FROM 
            inserted
        INNER JOIN
            FieldRep ON FieldRep.Name = FieldRepName;

    INSERT INTO MemberEligibility (MemberId, ICOId, StartDate, EndDate)
        SELECT 
            MemberId, ICOId, EligibilityStartDate, EligibilityEndDate 
        FROM 
            inserted
        INNER JOIN
            ICO ON ICO.Name = ICO;

    INSERT INTO MemberWorkerCompDetail (MemberId, AuditDate, ExpirationDate, TierId)
        SELECT 
            MemberId, WorkerCompAuditDate, WorkerCompExpirationDate, TierId
        FROM 
            inserted
        INNER JOIN
            WorkerCompTier ON WorkerCompTier.Name = WorkerCompTier;

    INSERT INTO MemberAttachment (MemberId, Data)
        SELECT MemberId, AttachmentData
        FROM Member
END

您可以通过使用表变量来保存新插入的 ID 来完成此操作and您要插入到其他表中的所有数据。你需要这样做,因为没有办法从第一个开始INSERTs 要连接回的数据inserted以这样的方式,你可以匹配IDENTITY值以及导致它们生成的行。

我们也得虐MERGE since INSERT不允许您在其表中包含目标表以外的任何内容OUTPUT clause.

我正在一个玩具示例中执行此操作,但希望您能够了解如何为完整的表结构编写它。

首先,一些表格:

create table dbo.Core (
    ID int IDENTITY(-71,3) not null,
    A varchar(10) not null,
    constraint PK_Core PRIMARY KEY (ID)
)
go
create table dbo.Child1 (
    ID int IDENTITY(-42,19) not null,
    ParentID int not null,
    B varchar(10) not null,
    constraint PK_Child1 PRIMARY KEY (ID),
    constraint FK_Child1_Core FOREIGN KEY (ParentID) references Core(ID)
)
go
create table dbo.Child2 (
    ID int IDENTITY(-42,19) not null,
    ParentID int not null,
    C varchar(10) not null,
    constraint PK_Child2 PRIMARY KEY (ID),
    constraint FK_Child2_Core FOREIGN KEY (ParentID) references Core(ID)
)
go

和观点:

create view dbo.Together
with schemabinding
as
    select
        c.ID,
        c.A,
        c1.B,
        c2.C
    from
        dbo.Core c
            inner join
        dbo.Child1 c1
            on
                c.ID = c1.ParentID
            inner join
        dbo.Child2 c2
            on
                c.ID = c2.ParentID
go

最后是触发器:

create trigger Together_T_I
on dbo.Together
instead of insert
as
    set nocount on
    declare @tmp table (ID int not null, B varchar(10) not null, C varchar(10) not null);

    merge into dbo.Core c
    using inserted i
    on
        c.ID = i.ID
    when not matched then insert (A) values (i.A)
    output
        inserted.ID /* NB - This is the output clauses inserted,
                    not the trigger's inserted so this is now populated */
        ,i.B,
        i.C
    into @tmp;

    insert into dbo.Child1(ParentID,B)
    select ID,B
    from @tmp

    insert into dbo.Child2(ParentID,C)
    select ID,C
    from @tmp

(我会在那里保留类似的评论,因为触发器内的语句包括OUTPUT条款往往很混乱,因为有two inserted比赛中的桌子)

(还值得注意的是,你在其中放入什么并不重要ON的条款MERGE,只要你确定它会fail进行匹配。你可能更喜欢,比如说,只是1=0如果你认为这更清楚了。我只是因为触发器的事实而变得可爱inserted.IDNULL)

现在我们进行插入:

insert into dbo.Together(A,B,C) values ('aaa','bbb','ccc')
go
select * from dbo.Together

并得到结果:

ID          A          B          C
----------- ---------- ---------- ----------
-71         aaa        bbb        ccc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用视图代替 INSERT 触发器和标识列 的相关文章

  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 如何在SSRS中的表上创建热图?

    如何在 SSRS 中创建这样的内容 颜色将根据行中的值 承销商 从红色变为绿色 所有这些都在一个组中 您可以通过右键单击各个单元格并根据表达式设置填充颜色来完成此操作 In the Image below I ve mistakingly
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 如何让 LinqToSql 将“索引提示”传递给 sql server?

    由于我们不能相信我们的客户会更新 sql server 中的索引统计信息等 因此我们过去不得不使用索引提示 http www sql server performance com tips hints general p1 aspx 由于我
  • 拆分列中的字符串并在列中添加值

    我有一个包含几行数据的表 如下所示 16 W 2 Work ALBO 00 Proposal ALxO Amendement 1 20091022 signed pdf 17 W 2 Work ALBO 00 Proposal Level1
  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 避免连接失败时出现空指针

    我有我的域类 带有命名查询 class Atendimento implements Serializable Funcionario funcionario static mapping funcionario column FUNCOD
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm

随机推荐

  • 函数声明和函数表达式性能差异

    我用过JSperf测试一个小样本code 根据我遇到的几篇文章 两者应该具有相似的性能 其中 test2 有一点优势 但这里的情况完全相反 有人可以解释为什么会有如此巨大的差异吗 Edit 我也明白他们两者之间的区别 请不要将此标记为重复项
  • 减少 Excel 中的单元格数量

    我有一个电子表格 管理时段中的组列表 想象下面是单元格 0830 0845 Bob Hoskins Jack Table Phil Cup 0845 0900 Bob Hoskins Jack Table Phil Cup 0900 091
  • 检查 liquibase 中表的约束

    我想使用 liquibase 在表上创建检查约束 这是检查约束 alter table userprefs add constraint chk null CHECK updatedate IS NOT NULL OR updateuser
  • C# DataGridView 复选框选中事件

    我想处理Checked的事件CheckBox我的专栏DataGridView并根据列检查值 真 假 执行操作 我尝试使用CellDirtyStateChanged没有任何成功 事实上 我想在用户选中或取消选中复选框后立即检测选中的更改 这是
  • 组装 - 在 bochs 中运行引导加载程序时出现问题

    我目前正在尝试在 bochs 中编译并运行一个简单的引导加载程序 目前 这是我的 bootloader asm 文件 BITS 16 ORG 0x7C00 Where the code gets mapped top jmp top Loo
  • 在销毁之前锁定对象的互斥量,它将释放内存或其他一些意外的事情

    这是一个好的和safe练习之前锁定c 对象的互斥体delete这个对象 无需解锁 我这样做是为了保护其他线程在这一毫秒内可能使用对象 概率非常低 之后内存会未分配吗 这是一个好的做法吗 例子 ptr to delete gt MUTEX l
  • 从 Android 服务器播放 Mp4 视频

    我想以流模式从服务器播放 mp4 格式和大小 4 5Mb 的视频 我使用的是 sdk 版本 2 3 在模拟器上 只提供声音但不提供任何图像 我还在 Samsung android sdk ver 2 1 和 LG optimus andro
  • Windows Phone 8 图像绑定

    我想将 image url 绑定到 Windows Phone 8 应用程序中的图像控件 代码如下
  • 我们可以替换 System.out.println() 中的“out”吗?

    首先 我很遗憾 因为我问了一个非常基本和特殊的问题 但我对 Java 和编程都是新手 我研究了system out println 中的 out 是系统类的一个对象 out 可以用系统类的任何其他对象替换吗 如果是的话 成员是什么以及如何
  • iPad modalPresentationStyle UIModalPresentationFormSheet 方向问题

    我在使用 modalPresentationStyle 时遇到问题 我在 tabbarcontroller 的第一个视图控制器的 viewDidload 中调用以下函数以便在应用程序启动时显示登录视图控制器 但问题是 当我在横向模式下启动应
  • CORS:凭据模式为“包含”

    是的 我知道你在想什么 又一个 CORS 问题 但这一次我被难住了 首先 实际的错误消息 XMLHttpRequest 无法加载 http localhost Foo API token 这 响应中 Access Control Allow
  • 如何找到数组元素的索引数组?

    我想用一个例子来展示我想要的 A 5 1 2 4 3 of distinct values B 3 3 1 5 2 我能找到一个在 MATLAB 中实现的库函数吗 C 5 5 2 3 1 someFun A B i e C i find A
  • 在微前端场景中如何共享状态?

    第一个想法是cookie 但你很快就会耗尽空间 有多种方法可以在微前端中进行通信 正如已经指出的 不同的微前端应该是松散耦合的 所以你永远不会直接从一个微前端到另一个微前端进行对话 关键问题是 您的微前端解决方案是基于服务器端 or 客户端
  • YouTube Streaming API 表示用户无法进行直播

    我在用着Google 的 YouTube API 资源管理器 备用 查找信息任意流媒体广播属于别人 无论我投入什么id场 我总是回来 error errors domain youtube liveBroadcast reason live
  • 从嵌套字典创建 Dataframe

    我正在尝试从具有嵌套字典的值列表创建一个数据框所以这是我的数据 d user 200 p val a 10 b 200 f val a 20 b 300 life 8 user 202 p val a 100 b 200 f val a 2
  • 如何找到某个邮政编码所属的州? [关闭]

    Closed 这个问题是无关 目前不接受答案 我有大约 30 000 个邮政编码 我需要提取州 我怎样才能实现这个目标 Copy thiscsv 文件来自this网站到您的工作簿中 然后使用VLOOKUP从邮政编码查找州
  • Bash:测试多个变量的相互相等性?

    测试多个变量是否都相等的正确方法是什么 if var1 var2 var3 syntax error 有必要写下面这样的东西吗 if var1 var2 var1 var3 var2 var3 cumbersome if var1 var2
  • 在 Three.js 中将 Geometry 转换为 BufferGeometry 是否会增加顶点数量?

    我一直在使用 fromGeometry 方法从常规 Geometry 对象创建 BufferGeometry 对象 并且我发现转换过程中顶点数量似乎有所增加 例如 如果我做类似的事情 var geometry new THREE BoxGe
  • Nodejs Mongoose 保存模型未定义不是一个函数

    我使用 Nodejs Express 路由和 Mongoose 来保存数据 我完成了核心路由 CRUD 操作 没有任何问题 但是 当我尝试对模型的其中一个字段执行一些操作 然后尝试使用 model save 保存模型时 它会说 save 方
  • 使用视图代替 INSERT 触发器和标识列

    我正在构建一个数据库来存储公司的客户数据 数据库中的表已标准化 因此我有多个使用外键约束链接在一起的表 Microsoft Access 将用于与数据库交互 作为前端 为了使事情变得更简单 我创建了一个视图 将所有必需的表连接在一起 以便最