日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

實現(xiàn)刪除主表數(shù)據(jù)時, 判斷與之關聯(lián)的外鍵表是否有數(shù)據(jù)_Mssql數(shù)據(jù)庫教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:經(jīng)驗總結:講解大型數(shù)據(jù)庫的設計準則
這篇文章主要介紹了大型數(shù)據(jù)庫設計所應掌握的基本準則,具體內(nèi)容請參考下文。 一個好的數(shù)據(jù)庫產(chǎn)品不等于就有一個好的應用系統(tǒng),如果不能設計一個合理的數(shù)據(jù)庫模型,不僅會增加客戶端和服務器

問題描述:
某個基礎信息表,與系統(tǒng)中30多個表存在外鍵關系,當刪除基礎數(shù)據(jù)時,需要判斷是否已經(jīng)被用過,如果用過則更改標志位,如果沒有用過則直接刪除,如何能很好實現(xiàn)這個處理?最好能夠自動適應表的變化
問題解決(SQL Server 2005
-- SQL Server 2005的錯誤處理容易控制, 因此, SQL Server 2005中可以直接刪除, 通過錯誤處理來確定是否需要更新.
-- 示例如下.
USE tempdb
GO
CREATE TABLE m(
id int PRIMARY KEY,
bz bit)
INSERT m SELECT 1, 0
UNION ALL SELECT 2, 0
CREATE TABLE c(
id int primary key,
a_id int references m(id)
ON DELETE NO ACTION)
INSERT c SELECT 1, 1
GO
-- 刪除處理存儲過程
CREATE PROC dbo.p_delete
@id int
AS
SET NOCOUNT ON
BEGIN TRY
BEGIN TRAN
DELETE FROM m WHERE id = @id
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
IF ERROR_NUMBER() = 547 -- 如果是外鍵約束錯誤
BEGIN
BEGIN TRY
BEGIN TRAN -- 更新標志
UPDATE m SET bz = 1
WHERE id = @id
COMMIT TRAN
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
END CATCH
END
ELSE
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
END CATCH
GO
-- 調(diào)用
EXEC dbo.p_delete 1
EXEC dbo.p_delete 2
SELECT * FROM m
SELECT * FROM c
GO
DROP TABLE c, m
DROP PROC dbo.p_delete
問題解決(SQL Server 2000
-- SQL Server 2000 對錯誤處理不好控制, 一般還是建議做判斷
-- 通過系統(tǒng)表查詢系統(tǒng)表,可以獲取某個表關聯(lián)的所有外鍵表
-- 示例存儲過程
CREATE PROC dbo.p_Delete
@tbname sysname, -- 基礎數(shù)據(jù)表名
@PkFieldName sysname, -- 基礎數(shù)據(jù)表關鍵字段名
@PkValue int -- 要刪除的基礎數(shù)據(jù)表關鍵字值
AS
SET NOCOUNT ON
DECLARE @bz bit, @s nvarchar(4000)
DECLARE tb CURSOR LOCAL
FOR
SELECT N'
SET @bz = CASE WHEN EXISTS(
SELECT * FROM ' QUOTENAME(@tbname)
N' A, ' QUOTENAME(OBJECT_NAME(B.fkeyid))
N' B
WHERE A.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))
N' = B.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.fkey AND id = B.fkeyid))
N' AND A.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))
N' = @id) THEN 1 ELSE 0 END'
FROM sysobjects A
JOIN sysforeignkeys B
ON A.id= B.constid
JOIN sysobjects C
ON A.parent_obj = C.id
WHERE A.xtype = 'f'
AND C.xtype = 'U'
AND OBJECT_NAME(B.rkeyid) = @tbname
OPEN tb
FETCH tb INTO @s
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @s, N'@tbname sysname, @id int, @bz bit OUT', @tbname, @PkValue, @bz OUT
IF @bz = 1
BEGIN
SET @s = N'UPDATE ' QUOTENAME(@tbname)
N' SET bz = 1 WHERE ' QUOTENAME(@PkFieldName)
N' = @id'
EXEC sp_executesql @s, N'@id int', @PkValue
RETURN
END
FETCH tb INTO @s
END
CLOSE tb
DEALLOCATE tb
SET @s = N'DELETE FROM ' QUOTENAME(@tbname)
N' WHERE ' QUOTENAME(@PkFieldName)
N' = @id'
EXEC sp_executesql @s, N'@id int', @PkValue
GO
注意事項
設置表的主/外鍵關系的時候,不要設置級聯(lián)刪除(ON DELETE CASCADE)

分享:SQL Server各種日期計算方法之二
  上個月的最后一天      這是一個計算上個月最后一天的例子。它通過從一個月的最后一天這個例子上減去3毫秒來獲得。有一點要記住,在Sql Server中時間是精確到3毫秒。這就是為

來源:模板無憂//所屬分類:Mssql數(shù)據(jù)庫教程/更新時間:2008-08-22
相關Mssql數(shù)據(jù)庫教程