当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL脚本生成的一些BUG(1)

MSSQL
无数据库日志文件恢复数据库方法两则(一)
SQLServer编写存储过程小工具(一)
SQLServer编写存储过程小工具(二)
SQLServer编写存储过程小工具(三)
Eclipse+JBoss+MySQL开发环境设置
MYSQL使用简述
一些有用的sql语句实例
枚举SQLServer的实例
SQLServer应用程序中的高级SQL注入
SQL Server数据库超级管理员账号防护知识
讲解如何实现互联网上数据库的安全
SQL 2005数据库转到SQL 2000的步骤讲解
带你轻松接触数据库生成xml的两个方法
用MS SQL Reporting Services生成报表
保护SQL Server的十个步骤
关于SQL SERVER的一些安全问题
SQL Server 2008数据库中使用表值参数
SQL Server 2005中用存储过程实现搜索功能
MS SQL数据库置疑解决办法
SQL Server密码管理的六个危险判断

MSSQL 中的 SQL脚本生成的一些BUG(1)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 122 ::
收藏到网摘: n/a

微软的SQL脚本生成令我伤透了心——我一直以为是我的程序上的问题,或者我操作上的失误,并且,客服人员屡屡埋怨我的程序bug,多次测试之后,才发现,原来都是微软惹的祸……

Sql Server的脚本生成有不少漏洞,经常由_art_center>它生成的脚本运行起来会有错误。下面举例说明:

1. 并没有根据sysdenpends的依赖关系生成SQL代码,而是根据所谓的“优先级”来生成。

比如:他认为view的优先级就要比function高。

那么,我写了下面的测试程序,形成如下的依赖关系:fnT1 <-- vwT1 <-- fnT2

就是,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>