SQL7为什么不可以级联删除?(50分)

  • 主题发起人 主题发起人 leonkin
  • 开始时间 开始时间
L

leonkin

Unregistered / Unconfirmed
GUEST, unregistred user!
如果主-明细表有外键关系,为什么用触发器SQL6.5可以做级联删除,SQL2K经设置可以设成允许级联删除
而SQL7为什么不可以,如果想这样做,那外键一定要不设。是不是这样,请教各位?
过后马上给分
 
应该可以呀,写个触发就可以了。
 
为什么没人回答我?????????????????????
 
一定可以的。
这是最普通的功能吧我想。
外键一定要设的。
 
MSSQL没有联级删除功能,这在它的文档里面已经有解释了,
并且提出如果想联级删除,要使用触发功能,而且主细表不能有PK(外键存在),
做到外键的功能也要用触发器(细表新增的时候,检查新增的PK字段的值
在主表有没有存在相应记录)。
 
以下是我用企业管理器生成的sql代码。
看到没有,主键,外键,和 ON DELETE CASCADE 。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_CadFile_Cad]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[CadFile] DROP CONSTRAINT FK_CadFile_Cad
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Cad]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Cad]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CadFile]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[CadFile]
GO

CREATE TABLE [dbo].[Cad] (
[CadId] [int] NOT NULL ,
[ManageNo] [varchar] (10) NOT NULL ,
[PicNo] [varchar] (10) NULL ,
[PicName] [varchar] (20) NOT NULL ,
[DraftMan] [varchar] (10) NOT NULL ,
[ExamMan] [varchar] (10) NULL ,
[DraftDate] [datetime] NULL ,
[PigeDate] [datetime] NULL ,
[FileFormat] [char] (3) NOT NULL ,
[ModifyDate] [datetime] NULL ,
[ModifyMan] [varchar] (10) NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[CadFile] (
[CadID] [int] NOT NULL ,
[FileName] [varchar] (50) NOT NULL ,
[FileSize] [int] NOT NULL ,
[BlobFile] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[Cad] WITH NOCHECK ADD
CONSTRAINT [Cad_PK] PRIMARY KEY CLUSTERED
(
[CadId]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[CadFile] ADD
CONSTRAINT [FK_CadFile_Cad] FOREIGN KEY
(
[CadID]
) REFERENCES [dbo].[Cad] (
[CadId]
) ON DELETE CASCADE NOT FOR REPLICATION
 
上面这位仁兄,我知道这个on delete cascade,这是在SQL2000才可以,在sql7.0中
是行不通的,根本就没有这个语名,你可以查sql 7.0 online book
 
你用SQL Server2000就有了,不用写程序
 
to leonkin:
你说的没错,7.0找不到。
没办法,只得用trigger
 
用触发器多好,可以自己控制,其实代码也很容易写。
 
to all
在SQL Server 7.0 中实现级联更新、删除操作非常麻烦,他的触发器是后触发的,既只有当一个
操作完成之后,才执行触发器的操作,因此,对于定义了外键的表,并且表中的主键值被其他表
引用时,删除操作无法执行,系统提示错误:
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_SC_S'. The conflict occurred in database 'test', table 'SC', column 'SNo'.
The statement has been terminated.
可以用存储过程实现级联删除:
CREATE PROCEDURE sp_DELETE_S
@S_NO char(10)
AS
BEGIN
DELETE SC WHERE SNo = @S_No
DELETE S WHERE SNo = @S_No
END
在SQL Server 7.0中,外键定义无CASCADE、SET NULL选项
在2K中,增加了CASCADE,仍然无SET NULL选项。
 
不可以就是不可以,除非用2k
想实现级联必须用trigger
 
多人接受答案了。
 
后退
顶部