国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL腳本生成的一些BUG

2024-08-31 00:43:42
字體:
供稿:網(wǎng)友

email: chair3@sina.com

微軟的SQL腳本生成令我傷透了心……我一直以為是我的程序上的問題,或者我操作上的失誤,
并且,客服務(wù)人員屢屢埋怨我的程序bug,多次測試之后,靠,原來都是微軟惹的禍……

Sql Server 的腳本生成有不少漏洞,經(jīng)常由它生成的腳本運(yùn)行起來卻有錯(cuò)誤。下面舉例說明:

1、并沒有根據(jù)sysdenpends的依賴關(guān)系生成SQL代碼,而是根據(jù)“優(yōu)先級”(呵呵,所謂的優(yōu)先級)來生成。
比如:他認(rèn)為view的優(yōu)先級就要比function高。
那么,我寫了下面的測試程序,形成如下的依賴關(guān)系:fnT1 <-- vwT1 <-- fnT2
就是,view vwT1處于依賴的中間。
------------------------------------
Create function fnT1()
Returns Integer
As
begin
Return 123
end
go

Create view vwT1
As
Select aa=dbo.fnT1()

Go

Create function fnT2()
Returns Table
As
Return (Select * From vwT1)
Go
-------------------------------------
運(yùn)行到數(shù)據(jù)庫之后,用Enterprise生成SQL代碼。(選項(xiàng)不一樣,會(huì)有所不同,我沒有選數(shù)據(jù)庫和用戶的)
-----------------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fnT1]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fnT1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fnT2]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fnT2]
GO

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

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

Create view vwT1
As
Select aa=dbo.fnT1()

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

Create function fnT1()
Returns Integer
As
begin
Return 123
end

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

Create function fnT2()
Returns Table
As
Return (Select * From vwT1)

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
-----------------------------------------------------------------------------
呵呵,一眼你就可以看出來了,建立view要比建立function先。而不是根據(jù)依賴關(guān)系建立……
毫無疑問,將會(huì)得到如下的錯(cuò)誤:(這個(gè)錯(cuò)誤可真嚴(yán)重!害得我好慘……)
---------------------------------------------------
服務(wù)器: 消息 208,級別 16,狀態(tài) 1,過程 vwT1,行 4
對象名 'dbo.fnT1' 無效。
服務(wù)器: 消息 208,級別 16,狀態(tài) 1,過程 fnT2,行 5
對象名 'vwT1' 無效。
---------------------------------------------------
2、作業(yè)腳本。

這個(gè)我就不說了,bug還不是很嚴(yán)重,主要是中文“--”注釋符的問題,英文版我沒有測試過,不過猜想應(yīng)當(dāng)沒有這個(gè)bug。
大家可以試試看。

3、還有一個(gè)SP的問題。

大家看過我的精華里面有spGetIDStr和spAnalyseStrList了吧,關(guān)系是后者依賴于前者。可是spGetIDStr我并沒有調(diào)用任何的表。
因此,每當(dāng)運(yùn)行Sql Server生成的腳本的時(shí)候,總是報(bào)告(大概是這樣的信息):
------------------------------------------------------------------------
spGetIDStr并不存在,無法在sysdepends里建立依賴關(guān)系,存儲過程spAnalyseStrList仍然建立。
--------------------------------------------------------------------------
無論我手工修改他的建立順序還是什么的,用它生成的腳本就是有錯(cuò)。呵呵,這個(gè)破微軟!
這里,再看看第三個(gè)bug,看我下面的測試程序:
(原理:當(dāng)sp沒有對表或視圖等數(shù)據(jù)庫對象有依賴關(guān)系的時(shí)候,sp被別的sp引用的時(shí)候也將無法建立依賴關(guān)系)
形成依賴關(guān)系:spB1 <--- spA1
------------------------------------------------------------------------
Create Proc spB1
As
Return 11

Go

Create proc spA1
As
Begin
Declare @i int
Exec @i=spB1
Return @i*2
End
Go
-------------------------------------------------------------------------
生成的腳本就為:
-------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spA1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[spA1]
GO

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

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


Create proc spA1
As
Begin
Declare @i int
Exec @i=spB1
Return @i*2
End

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

Create Proc spB1
As
Return 11


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

-------------------------------------------------------------------------
嘻嘻。大家這回應(yīng)當(dāng)明白我故意命名為spA1,spB1緣故了。因?yàn)槿绻麤]有依賴關(guān)系的話,A自然排在B前面,你看微軟可不就是這么做的么?
呵呵,發(fā)現(xiàn)微軟的工程師有時(shí)候也好笨……:),你看spA1就建立在spB1的前面,而不是它的實(shí)際關(guān)系(她根本沒有在sysdepends里面寫)
幸好這個(gè)bug還不是很大,怎么說SP還是建立了起來。


各位有興趣的可以試試別的,比如sp與fn,sp Group等等,我懶:)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武冈市| 阳江市| 巴林右旗| 彭山县| 巴南区| 金湖县| 全州县| 长治县| 临城县| 东安县| 巨鹿县| 长寿区| 吉林省| 额敏县| 长葛市| 孙吴县| 永善县| 大竹县| 无棣县| 乌兰县| 信丰县| 阳春市| 九台市| 衡山县| 新泰市| 德清县| 普格县| 仪陇县| 荆州市| 桐梓县| 普定县| 铜鼓县| 张家口市| 固原市| 白山市| 宁城县| 富源县| 新野县| 东丽区| 永济市| 宁夏|