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等等,我懶:)。
|
新聞熱點(diǎn)
疑難解答
圖片精選