防止在C#或SQL中插入或更新数据

时间:2017-03-13 09:43:24

标签: c# sql linq

我有两个表Header和Item,它有一对多关系。

标题表

blackfire.agent_socket

和项目表

Id      StartDate   EndDate 
--------------------------------------- 
1       1999/1/1    1999/5/1        
2       2000/1/1    2000/4/1
3       2000/1/1    2000/5/1

如何阻止使用Id HeaderRef SLRef ------------------------------------- 101 1 201 102 2 201 HeaderRef=3添加项目,因为它具有相同的SLRef=201,而SLRef引用它的标题行包含HeaderRef另一个具有相同StartDate and EndDate的项目在该范围内提到SLRef

2 个答案:

答案 0 :(得分:2)

假设您正在使用MS SQL Server,有两种方法可以实现您的目标:

1)按照其他用户的建议使用触发器。触发器将用于INSERT / UPDATE,它将检查日期范围并允许添加新值或引发错误。

2)您可以在ItemTable中使用复合主键:

CREATE TABLE [dbo].[ItemTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [HeaderRef] [int] NOT NULL,
    [SLRef] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [HeaderRef] ASC,
    [SLRef] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

现在这将对ItemTable施加约束,并且sql server将不允许headerRef和SLRef int值(键)的重复组合。

返回你的HeaderTable,你可以设置唯一约束来停止复制开始和结束日期的范围

CREATE TABLE [dbo].[HeaderTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [STARTDATE] [datetime] not NULL,
    [ENDDATE] [datetime] not NULL,
 CONSTRAINT [PK_HeaderTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

现在在HeaderTable上为开始日期和结束日期创建唯一索引。

/****** Object:  Index [IX_HeaderTable]    Script Date: 03/13/2017 12:24:51 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_HeaderTable] ON [dbo].[HeaderTable] 
(
    [ENDDATE] ASC,
    [STARTDATE] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

您还可以在HeaderTable上添加另一个约束,以检查开始日期是否在结束日期之前。

ALTER TABLE [dbo].[HeaderTable]  WITH CHECK ADD  CONSTRAINT [CheckEndLaterThanStart] CHECK  (([ENDDATE]>=[STARTDATE]))
GO

ALTER TABLE [dbo].[HeaderTable] CHECK CONSTRAINT [CheckEndLaterThanStart]
GO

希望这有帮助!

答案 1 :(得分:1)

您正在寻找DML触发器,简单来说,它是某种sql函数或过程,当用户尝试通过添加或删除来更改数据库内的数据时会自动调用它。此外,触发器的主体可以包含一些验证逻辑,因此除非满足某个条件,否则不会插入数据