SQL指令碼生成的一些BUG(1)(轉)

BSDLite發表於2007-08-16
SQL指令碼生成的一些BUG(1)(轉)[@more@]微軟的SQL指令碼生成令我傷透了心——我一直以為是我的程式上的問題,或者我操作上的失誤,並且,客服人員屢屢埋怨我的程式bug,多次測試之後,才發現,原來都是微軟惹的禍……

Sql Server的指令碼生成有不少漏洞,經常由_art_center>它生成的指令碼執行起來會有錯誤。下面舉例說明:

1. 並沒有根據sysdenpends的依賴關係生成SQL程式碼,而是根據所謂的“優先順序”來生成。

比如:他認為view的優先順序就要比function高。

那麼,我寫了下面的測試程式,形成如下的依賴關係:fnT1
就是,view vwT1處於依賴的中間。





_NOBR> _CODE>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_CODE>

_NOBR>

執行到資料庫之後,用Enterprise生成SQL程式碼。要注意選項不一樣,生成的程式碼會有所不同,在這裡我沒有選資料庫和使用者。

_NOBR> _CODE>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_CODE>

_NOBR>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-960729/,如需轉載,請註明出處,否則將追究法律責任。

相關文章