楼主: 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
41#
 楼主| 发表于 2003-12-6 22:21 | 只看该作者
将Access数据库移植到Microsoft SQL Server 7.0
feyo.6to23.com  2002-6-7  飞跃认证资源


摘要:本文描述了将Access数据库转换到SQL Server 数据库的过程和工具

简介

随着用户对于企业级高性能数据库的需求的增长,用户时常要从Microsoft Access Jet引擎的文件-服务器环境下转换到
Microsoft SQL Server的客户-服务器环境。Microsoft Office 2000中的Access 2000 Upsizing Wizard可实现将数据表和
查询转移到SQL Server 7.0中。如果您用的是Access的较早的版本,您可以先将它升级为Access 2000,然后再使用其中的
Upsizing Wizard,从而将您的应用移植到SQL Server中。

如果您并不太愿意采用Access 2000 和Upsizing Wizard来实现移植,本文可以作为将Access 2000移植到SQL Server的一
个指南。转移一个Access上的应用首先需要将数据转移到SQL Server,然后将查询转移进数据库,或是转移为SQL文件以备
稍后执行。最后要采取的步骤是移植应用程序。

数据库移植中用到的SQL Server 工具

SQL Server管理器(SQL Server Enterprise Manager)

SQL Server管理器 允许对SQL Server以及SQL Server中的对象进行企业级的配置和管理。SQL Server管理器提供一个强有
力的scheduling引擎,高度的容错力和一个嵌入式的复制管理界面。使用SQL Server管理器可以实现以下功能:

管理连接和用户许可

创建脚本程序

管理SQL Server对象的备份

备份数据和事务处理日志

管理表、视图、存储过程、触发器、索引、规则、默认值以及用户定义的数据类型

建立全文本索引、数据库图表和数据库维护计划

输入和输出数据

转换数据

执行各种网络管理任务

在以Microsoft Windows NT为操作系统的计算机中,SQL Server Manager由SQL Server Setup进行安装,并被默认为服务
器组件,而在运行着Windows NT 和Microsoft Windows 95的机器上,它将被默认为客户方组件。您将从SQL Server
Manager的图形用户界面中启动数据转移服务(DTS,Data Transformation Services)。

数据转移服务(Data Transformation Services ,DTS)

数据转移服务允许您在多种异构数据源之间输入和输出数据,这些数据源采用基于数据库的OLE体系结构;或在使用SQL
Server 7.0的多个计算机之间转移数据库和数据库对象;您还可以通过运用数据转移服务,更便捷地在一个在线事务处理
系统(OLTP)中建立数据仓库和数据中心。

DTS Wizard允许您交互地创建DTS包,通过OLE DB和ODBC来输入、输出、验证和转移数据。DTS Wizard还允许您在关系型数
据库之间拷贝图解(schema)和数据。

SQL Server 查询分析器(Query Analyzer)

SQL Server 查询分析器是一种图形化的查询工具,通过它您可以分析一个查询,同时执行多个查询,查看数据和获取索引
建议。SQL Server 查询分析器提供了showplan选项,可用来显示SQL Server查询优化器所选择的数据提取方法。

SQL Server Profiler

SQL Server Profiler可以实时地捕获数据库服务器活动的连续记录。SQL Server Profiler允许您监控SQL Server产生的
事件,过滤基于用户指定标准的事件,或将操作步骤输出到屏幕、文件或数据表。运用SQL Server Profiler,您可以重新
执行所捕获的上一次操作。这种工具可以帮助应用程序开发者识别那些可能会降低应用程序性能的事务处理。在将一个基
于文件体系结构的应用程序移植到客户/服务器结构中时该特性是很有用的,因为它的最后一步包括对面向新的客户/服务
器环境的应用程序进行优化。

转移表和数据

使用DTS Wizard将您的Access数据转移到SQL Server,可采取以下步骤:

在 SQL Server Manager(Enterprise Manager)的工具菜单中,鼠标指向“Data Transformation Services”, 然后点击
“Import Data.”

在“选择数据源”( Choose a Data Source)的对话窗口中,选择Microsoft Access为数据源,然后输入您的.mdb文件
名(mdb为文件扩展名)或者选择浏览文件。

在“选择数据目标”(Choose a Destination)的对话窗口中,选择“Microsoft OLE DB Provider for SQL Server”,
再选择好数据库服务器,然后点击所需的认证模式。

在“指定表备份或查询”( Specify Table Copy or Query)的对话窗口中,点击“拷贝表”(Copy tables)。

在“选择数据源”的对话窗口中,点击“选择所有项”( Select All)。

移植Microsoft Access查询

您可以将Access的查询以下面的格式之一转移至SQL Server中:

事务处理SQL脚本程序(Transact-SQL scripts )

事务处理SQL语句通常是由数据库程序调用的,但是您也可以使用SQL Server 7.0中包含的SQL Server 查询分析器直接运
行它们。SQL Server 查询分析器可帮助开发者测试事务处理SQL语句,或运行那些执行查询处理、数据操作(插入,修
改,删除)和数据定义(创建表)的事务处理SQL语句。

存储过程(Stored procedures )

开发者可以将大部分产生自Access查询(查找,插入,修改,删除)的事务处理SQL语句转移至存储过程。用事务处理SQL
语句书写的存储过程可以用来对您的数据存取打包,并使之标准化,而且存储过程实际上是存储在数据库中的。存储过程
可以带参数,也可不带参数,可以由数据库程序调用或者由SQL Server查询分析器手动执行。

视图(Views )

视图是从一个或多个表中显示特定的行和列的虚拟表。它们允许用户可以不直接执行构成查询基础的复杂连接而建立查
询。视图不支持参数的使用。连接多个数据表的视图不能用INSERT, UPDATE或 DELETE语句来修改。视图由事务处理SQL语
句调用,也可用于SQL Server查询分析器中运行的程序段。SQL Server视图和SQL-92标准不支持视图中的ORDER BY排序子
句。如欲了解事务处理SQL,存储过程和视图的其他信息,请参阅SQL Server 在线参考书。

Access查询类型的SQL Server移植选择与建议

一个SELECT语句可以存储在事务处理SQL文件、存储过程或是视图中。建立存储过程是将数据库应用开发与数据库设计的物
理实施分开的最佳方法。存储过程可在一处创建而由应用程序调用。

如果存储过程所基于的数据库变化了,而存储过程经过仔细的修改以反应这些变化,则对存储过程的调用将不会受到破
坏。

交叉表(CROSSTAB)

交叉表经常用于总结报表。

一个Access的交叉表可以通过SQL程序段、存储过程或视图中的事务处理SQL语句来执行。每当发出一个查询时,数据连接
被重现执行以确保最近的数据得到使用。

根据实际应用情况,比较合适的方法是将交叉表中的数据存储为一个临时表(参考下面的MAKE TABLE),临时表对资源的
需求比较少,但是临时表在建立的同时只提供对数据的一个快照(snapshot)。

创建表(MAKE TABLE)

Access中的“MAKE TABLE”( 创建表)可以通过事务处理SQL脚本程序或存储过程中的事务处理SQL语言的建表语句
“CREATE TABLE”来执行。语法如下所示:

SELECT [ ALL | DISTINCT ]

[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]

<select_list>

[ INTO new_table ]

[ FROM {<table_source>} [,…n] ]

[ WHERE <search_condition> ]

[ GROUP BY [ALL] group_by_expression [,…n]

[ WITH { CUBE | ROLLUP } ]

CREATE TABLE mytable (low int, high int)

UPDATE(修改)

UPDATE语句可以存储在事务_SQL脚本程序中,然而比较好地执行UPDATE语句的方法是创建一个存储过程。

APPEND(添加)

ALLEND语句可以存储在事务_SQL脚本程序中,然而比较好地执行APPEND语句的方法是创建一个存储过程。

移植Microsoft Access的查询到存储过程和视图

每个Access查询都必须用以下的一系列语句替换:

CREATE PROCEDURE <NAME_HERE> AS

< SELECT, UPDATE, DELETE, INSERT, CREATE TABLE statement from Microsoft Access >

GO

CREATE VIEW <NAME_HERE> AS

<Place (SELECT only, with no parameters) Microsoft Access Query>

GO

对每个Access查询应执行:

打开Access,然后在SQL Server中,打开SQL Server查询分析器。

在Access的数据库窗口中点击“Queries”tab键,然后点击“Design”按钮。

在“View”菜单上点击“SQL”按钮。

将整个查询粘贴到SQL Server查询分析器中。

测试语法,保存事务处理SQL语句以备后用,或者在数据库中执行这些语句。您可以选择将事务处理SQL语句保存到一段脚
本程序中。

移植Microsoft Access查询到事务处理SQL语句

大部分的Access查询应该转换成存储过程和视图。然而,有一些应用程序开发者不太常用的语句可以存储为事务处理SQL脚
本,一种以sql为文件扩展名的文本文件。 这些文件可以在SQL Server查询分析器中运行。

如果您打算将一些Access查询转换为sql文件的话,可以考虑根据它们使用的方式有区别地将这些事务处理SQL语句分别放
在几个脚本程序中。例如,您可以将必须以同样频率运行的事务处理SQL语句归类到同一个脚本中。另一个脚本中则应包含
所有只在某些条件下运行的事务处理SQL语句。此外,必须以一定顺序执行的事务处理SQL语句应当归类到一个不连续的脚
本中。

将Access语句转移到事务处理SQL 文件

将语句拷贝到SQL Server查询分析器中

使用蓝色的多选项图标分析语句

在适当时候执行该语句

要执行Access中的创建表(MAKE TABLE)的查询任务的开发者在SQL Server中有几种选择。开发者可创建下列对象之一:

一个视图

视图具有动态的虚拟表的效果,可提供最近的信息。这是一个输入/输出强化器,因为每当发出一个查询时它都要求对数据
表重现建立连接。

一个临时表

临时表为已连接的用户会话建立一个快照。您可以建立局部的或全局的临时表。局部临时表只在当前会话中可见,而全局
临时表则在所有会话都是可见的。在局部临时表的名字前加上单个数字的前缀((#table_name)),而在全局临时表的名字
前加上两位数字的前缀(##table_name)。对临时表的查询执行起来非常快,因为它们取得一个结果集的时候通常只用一个
表,而不是将多个表动态地连接在一起来。

如欲了解临时表的其他信息,请参阅SQL Server在线参考书。

SQL Server 7.0中的数据转换服务(DTS)允许您通过创建包来实现临时表建立的标准化、自动化和进度安排。例如,当您
移植Access 2.0中的Northwind 范例数据库时,用于季度数据报表的交叉表可转变为一个视图或者一个可在规范基础上建
立临时表的数据转换。如欲了解关于DTS的其他信息,请参阅SQL Server在线参考书。

其他设计上的考虑

下面是当您将您的Access应用移植到SQL Server时必须考虑的一些其他问题:

使用参数

带参数的SQL Server存储过程需要一种不同于Access查询的语法格式,例如:

Access 2.0格式:

查询名:Employee Sales By Country, in NWIND.mdb:

PARAMETERS [Beginning Date] DateTime, [Ending Date] DateTime;

SELECT Orders.[Order ID], [Last Name] & ", " & [First Name] AS Salesperson, Employees.Country, Orders.
[Shipped Date], [Order Subtotals].Subtotal AS [Sale Amount]

FROM Employees INNER JOIN (Orders INNER JOIN [Order Subtotals] ON Orders.[Order ID] = [Order Subtotals].
[Order ID]) ON Employees.[Employee ID] = Orders.[Employee ID]

WHERE (((Orders.[Shipped Date]) Between [Beginning Date] And [Ending Date]))

ORDER BY [Last Name] & ", " & [First Name], Employees.Country, Orders.[Shipped Date];

SQL Server 7.0格式:

CREATE PROCEDURE EMP_SALES_BY_COUNTRY

@BeginningDate datetime,

@EndingDate datetime

AS

SELECT Orders.[Order ID], [Last Name] + ", " + [First Name] AS Salesperson, Employees.Country,

Orders.[Shipped Date], [Order Subtotals].Subtotal AS [Sale Amount]

FROM Employees INNER JOIN (Orders INNER J

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
42#
 楼主| 发表于 2003-12-10 09:32 | 只看该作者
利用数据库复制技术 实现数据同步更新
复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
SQL复制的基本元素包括
出版服务器、订阅服务器、分发服务器、出版物、文章
SQL复制的工作原理
SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
SQL SERVER复制技术类型
SQL SERVER提供了三种复制技术,分别是:
1、快照复制(呆会我们就使用这个)
2、事务复制
3、合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
第一先来配置出版服务器
(1)选中指定[服务器]节点
(2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
(3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。
(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
第二创建出版物
(1)选中指定的服务器
(2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框
(3)选择要创建出版物的数据库,然后单击[创建发布]
(4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器
(6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
(7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
第三设计订阅
(1)选中指定的订阅服务器
(2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
(3)按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。
(4)单击[完成]。完成订阅操作。
完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
43#
 楼主| 发表于 2003-12-10 09:33 | 只看该作者
--一个手工同步的方案

--定时同步服务器上的数据

--例子:
--测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
--服务器上的表(查询分析器连接到服务器上创建)
create table [user](id int primary key,number varchar(4),name varchar(10))
go
--以下在局域网(本机操作)
--本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
        drop table [user]
GO
create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
go
--创建触发器,维护state字段的值
create trigger t_state on [user]
after update
as
update [user] set state=1
from [user] a join inserted b on a.id=b.id
where a.state is not null
go

--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名为:xz,用户名为:sa,无密码
if exists(select 1 from master..sysservers where srvname='srv_lnk')
        exec sp_dropserver 'srv_lnk','droplogins'
go
exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','xz'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa'
go

--创建同步处理的存储过程
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_synchro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
        drop procedure [dbo].[p_synchro]
GO
create proc p_synchro
as
--set  XACT_ABORT on
--启动远程服务器的MSDTC服务
--exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output

--启动本机的MSDTC服务
--exec master..xp_cmdshell 'net start msdtc',no_output

--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGIN DISTRIBUTED TRANSACTION
        --同步删除的数据
        delete from srv_lnk.test.dbo.[user]
                where id not in(select id from [user])

        --同步新增的数据
        insert into srv_lnk.test.dbo.[user]
        select id,number,name from [user] where state is null
       
        --同步修改的数据
        update srv_lnk.test.dbo.[user] set
                number=b.number,name=b.name
        from srv_lnk.test.dbo.[user] a
                join [user] b on a.id=b.id
        where b.state=1
       
        --同步后更新本机的标志
        update [user] set state=0 where isnull(state,1)=1
--COMMIT TRAN
go

--创建作业,定时执行数据同步的存储过程
if exists(SELECT 1 from msdb..sysjobs where name='数据处理')
        EXECUTE msdb.dbo.sp_delete_job @job_name='数据处理'
exec msdb..sp_add_job @job_name='数据处理'

--创建作业步骤
declare @sql varchar(800),@dbname varchar(250)
select @sql='exec p_synchro'          --数据处理的命令
        ,@dbname=db_name()                        --执行数据处理的数据库名

exec msdb..sp_add_jobstep @job_name='数据处理',
        @step_name = '数据同步',
        @subsystem = 'TSQL',
        @database_name=@dbname,
           @command = @sql,
        @retry_attempts = 5,                 --重试次数
        @retry_interval = 5                  --重试间隔

--创建调度
EXEC msdb..sp_add_jobschedule @job_name = '数据处理',
        @name = '时间安排',
        @freq_type = 4,                                 --每天
        @freq_interval = 1,                                --每天执行一次
        @active_start_time = 00000                --0点执行
go

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
44#
发表于 2003-12-13 09:10 | 只看该作者

Re: 锁问题

最初由 wangyuzhen 发布
[B]觉得锁问题在我们这里没有表现,因为我们用的PowerBuilder在提交修改时可以带上where条件,指定被修改字段必须和上次访问时的值一致才可以。
另外觉得那个例子有问题,为什么要提交25,000?而不是:存款余额+5000? [/B]

那个例子是为了说明加锁的意义,

这个操作要这样完成

1. 从表中取出余额存款记录
2. 存款余额+5000 写回表中

如有两个并行操作同时完成1操作, 就会产生问题
因此, 在执行1,2操作是一定要对记录加锁, 以保证一次只有一个操作在执行.
你的问题只是一个如何实现的问题, 提价存款余额+5000时, 这个锁是由数据库自动实现的, 因为每条UPDATE语句在执行的时候都会先对目标记录加锁.

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
45#
 楼主| 发表于 2003-12-15 13:00 | 只看该作者
SQL Server如何解决加密问题?

---摘自互联网
SQL Server的6.0和6.5版本中,16位和32位客户软件在使用多协议网络库时设置加密选项可以进行数据在线加密。
 SQL Server依靠Microsoft Windows NT RPC 应用程序接口来完成网络数据加密。 Windows NT RPC使用40位RC4加密方法。这种方法允许出口,所以美国和国际版的这种加密方法没有区别。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
46#
 楼主| 发表于 2003-12-15 13:01 | 只看该作者
编写数据库脚本

作者:Andrew Clinick
发表日期:2000 年 1 月 10 日
我在“If It Moves, Script It”(英文)(http://msdn.microsoft.com/worksh ... scripting061499.asp)这篇文章中曾谈到,如何使用“Windows Script Host(WSH)”( Windows 脚本主机) 管理 Windows 和 Windows 中的应用程序。文中的大多数示例都是基于管理 Windows 操作系统自身的,并不基于在该操作系统下运行的应用程序。为迎接新千年,我想我应该谈谈,如何在众多显露可脚本化接口的应用程序中使用脚本。这次只涉及“SQL Server”。在以后的几个月中,我将着重谈 Exchange、Office 和“系统管理服务器”。
--------------------------------------------------------------------------------
您可以通过使用“分布式管理对象”、“数据转换服务”和新的“SQL Server XML”实现,将脚本用于“SQL Server”。
--------------------------------------------------------------------------------

许多人都能够通过“Active Data Object(ADO)”和“Active Server Page (ASP)”技术访问数据库了。ADO 在帮助您查询和更新数据库方面做了大量的工作 — 但在备份(Y2K 问题带给我们的警惕)或是数据库之间的传输数据方面,其表现又如何呢?而这时就非涉及到 XML 不可了。
在此,我将告诉您如何通过使用 ADO 的伴随技术 - 特别是“分布式管理对象”、“数据转换服务”和新的“SQL Server XML”实现,将脚本用于“SQL Server”。
分布式管理对象

“分布式管理对象 (DMO)”是一组 COM 对象,它将“SQL Server”数据库和复制管理封装在一起。这意味着您可以编写一个 WSH 脚本,将特定表中的所有数据都复制到用制表符分隔的文件中,这有助于大量数据的移动。我之所以选择这个示例,是因为它的代码编写起来简单,但 DMO 允许您获取“SQL Server”中的每个对象,使您能够编写出一些非常优秀而有意义的管理脚本。
DMO 的关键是 SQLDMO.SQLServer 对象,它是基本的对象,它允许您连接到服务器并获取所有可用对象。在这种情况下,我将使用 Database 集合来选择数据库,然后从 table 集合访问要转储到文件的表。如果不提供数据库,将出现错误消息,并且脚本也就结束了。如果不提供表名,脚本将在数据库所有的表中循环,并导出非系统表。如果提供了数据库,它就导出该表。该示例虽然功能有限,但它为“SQL Server”提供了基于命令行的简单的导出实用程序,您可以以它为根据。
现在先看一段代码:


'声明与 sql 谈话时使用的变量
Dim oServer ' SQL Server 对象
Dim oDatabase ' 要使用的目标数据库
Dim oBCP ' BCP 对象
Dim nRows ' 从 bcp 返回的行数
dim table ' 表对象
on error resume next
' 第一个参数必须是数据库
if WScript.Arguments(0) = "" then
    WScript.Echo "您没有提供要连接的数据库"    WScript.Quit
end if
' 创建 SQL DMO 的实例
Set oServer = CreateObject("SQLDMO.SQLServer"
' 创建 SQL DMO Bulkcopy 对象的实例
Set oBCP = CreateObject("SQLDMO.BulkCopy"
oServer.EnableBcp = True
' 登录到本地服务器
' 希望您已经更改了 sa 口令!!
oServer.Connect ".", "sa"
' 连接到提供的数据库
Set oDatabase = oServer.Databases(Wscript.Arguments(0))

' 将分隔符设置为逗号
oBCP.ColumnDelimiter = vbComma
' 将文件类型设置为以逗号分隔
oBCP.DataFileType = SQLDMODataFile_CommaDelimitedChar
oBCP.ImportRowsPerBatch = 1000
oBCP.MaximumErrorsBeforeAbort = 1
BCP.RowDelimiter = vbCrLf
oBCP.ServerBCPDataFileType = SQLDMOBCPDataFile_Char
oBCP.UseExistingConnection = True
' 如果未提供表,则转储所有的表
if wscript.Arguments(1) = "" then
    for each table in oDatabase.tables
        ' 确保该表不是系统表
        if table.systemobject = false then
            oBCP.DataFilePath = table.name & ".csv"
            nRows = table.ExportData(oBCP)
            wscript.Echo nRows & " rows exported from " & table.name
        end if
    nextelse    ' 设置输出文件
    oBCP.DataFilePath = wscript.Arguments(1) & ".csv"
     nRows = oDatabase.Tables(wscript.arguments(1)).ExportData(oBCP)
    wscript.Echo nRows & " rows exported from " & wscript.arguments(1)
end if


DMO 的全部内容要比本文介绍的多得多,但我希望本文能给您一些感性认识:用某些简单的 WSH 脚本和 DMO 可以做些什么。您可以下载我的示例(英文)(http://msdn.microsoft.com/voices/sqlexport.wsf)。有关 DMO 的详细信息,请访问 http://msdn.microsoft.com/library/psdk/sql/9_dmoc01.htm(英文)(http://msdn.microsoft.com/library/psdk/sql/9_dmoc01.htm)。
数据转换服务

导出到 Comma Separated 文件 (CSV),可以作为将数据导出到 SQL 和从 SQL 导入的起点,但这不象是尖端科技(太过于 20 世纪了,您不觉得吗?)。“SQL Server 7.0”以“数据转换服务 (DTS)”的形式,提供了相当完善的导入和导出机制。幸运的是,脚本在“SQL Server”的这个新领域中仍有一席之地,因此,您可以用“Visual Basic(R) 脚本编辑 (VBScript)”、“JScript(R)”或“Perl”的技术来扩展 DTS 的能力。
DTS 的设置非常简单,特别是在使用“SQL ServerEnterprise Manager”的时候。在默认情况下,“SQL Server”有一个定义的文件夹,可存储任何转换,而且“Enterprise Manager”提供了创建和编辑 DTS 程序包的大的图形用户界面 (GUI)。在下面的示例中,我选择了已由 sqlexport.wsf 文件创建的 employees.csv 文件和“SQL Server”中的一个新表。DTA 程序包将创建该表,加载到 Text 文件中,然后运行某个脚本,将数据转换到“SQL Server”的表中。

DTS 程序包中的转换,使脚本在整个转换过程中保持运行状态。“SQL Enterprise Manager”提供的简单的脚本编辑器,有一个语法分析脚本按钮。在运行脚本之前,该按钮将警告您脚本中的错误。在转换过程中,该脚本使用 VBScript 的 Cint 功能,将 employeeid 和 deptid 的输入转换为 int,并将所有的电子邮件地址转换为小写字母。

'**********************************************************************
'     Visual Basic 转换脚本
'     把每个源列复制到
'     目标列
'***********************************************************************
Function Main()
    DTSDestination("EmployeeID" = cint(DTSSource("Col001")
    DTSDestination("FirstName" = DTSSource("Col002"
    DTSDestination("LastName" = DTSSource("Col003"
    DTSDestination("email" = lcase(DTSSource("Col004")
    DTSDestination("extension") = DTSSource("Col005")
    DTSDestination("office") = DTSSource("Col006")
    DTSDestination("DeptID") = cint(DTSSource("Col007"))
    Main = DTSTransformStat_OK
End Function


用 DTS,能够采用某些完善的导入/导出机制,并使您能够在转换的任何一步中使用脚本。重要的是,要注意脚本可能不是操作数据的最佳方式 — 尤其是您的数据集很大的话。如果您有大量数据需要转换,而且性能也很重要,则您可能需要考虑使用 Visual Basic 或 C++ 来创建 COM 组件,然后从 DTS 内部调用该组件。也就是说,如果性能并不重要,并且要在数据导入/导出时对它进行转换,则脚本为您提供了实现这一点的灵活机制,并使您能够将所有代码存储到“SQL Server”数据库中,使部署变得相当简单。
关于 XML

目前,XML 看起来像是在应用程序之间共享数据的最佳工具,所以“SQL Server”的所有管理肯定都得到了 XML 的好处。编写提取数据库中所有数据的脚本,以及编写用编程的方法创建 XML 文档的脚本,都是可能的。但是,如果您只要查询“SQL Server”的话,最好使它在 XML 中返回数据,然后用脚本操作该 XML。“SQL Server”组最近发行了“SQL Server XML”技术的非正式版本,完全做到了这一点。
新的 XML 技术使用起来非常简单。实际上是对服务器发出 HTTP 请求,将查询传递给服务器,而服务器返回 XML。为了举例说明,我创建了简单的 WSH 脚本,它向本地机器查询 North Wind 数据库的雇员表中的所有数据。为访问 XML,该脚本使用了“Internet Explorer 5.01”附带的 XML 分析程序。此对象的美妙之处,在于它处理您所有的 HTTP 请求,并使您能够同步调用。因为您再也不用处理任何事件驱动的程序,所以,它对编写脚本很有帮助。
该脚本非常简单。它创建了 XML 分析程序的实例,使用分析程序打开 URL,然后将结果保存为 .xml 文件。只需五行的脚本,不错吧!


' 设置请求的 url
xmlpath = "http://localhost/Northwind?sql=select+*+from+employees+for+xml+auto"
' 创建“XML 分析程序”的实例
Set myXMLDoc = CreateObject("Microsoft.XMLDOM")
' 不需要异步
myXMLDoc.async = false
' 加载该 URL
myXMLDoc.Load xmlpath
' 保存文档
myXMLDoc.save "employees.xml"


它的强大之处在于,现在可很容易地与服务器建立远程连接并转储数据;只要更改 URL,您早已做过了。此例告诉您如何导出,但是您可以轻松地写出导入例行程序,用 XML 分析程序在 XML 中反复操作并将值插入数据库中。
摘要

“SQL Server”提供全面的可编写脚本的机制,用于本地或远程管理数据库。DMO 和 DTS 已经上市(实际上,DMO 已发行了许多版本),所以您可以直接利用它们,使您的数据库管理任务自动化。Windows 2000 已与“Windows Script Host 2.0”一起上市,所以以上所有脚本的运行,都不受装有“SQL Server”的 Windows 2000 服务器的条件限制。“SQL Server”中新的 XML 技术使存取数据变得轻而易举,从而使编写“SQL Server”的脚本更加容易。有关“SQL Server”的详细信息,请访问 SQL Server Developer enter(英文)(http://msdn.microsoft.com/sqlserver/)。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
47#
 楼主| 发表于 2003-12-15 13:02 | 只看该作者
怎样才能限制SQL Server只能让指定的机器连接

---摘自《SQL编程技巧站》
Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?
(v1.0 19.10.1998)


怎样才能限制我的SQL Server只能让指定的机器连接


A. SQL Server has no built-in tools/facilities to do this. It also does not have the facility to run a stored-procedure on connection that could be written/used to do this. Therefore you have the following choices :-

   SQL Server没有这样的功能,也没有提供在连接时执行某一特定过程的功能。这里介绍几种实现的方法

1. Put the SQL Server behind a firewall and use that to restrict access. This is the most secure and functional way to do what you want.

    使用防火墙,它提供了安全和你想用的工具。

2. Write your own ODS Gateway and point the clients at that instead of the SQL Server - the ODS Gateway will then do the checking. However, there is nothing stopping clients figuring out the correct SQL client-config entries to point straight at the SQL Server. There are examples of ODS code in the SQL Programmers Toolkit - available for free download from the MS website.

    写自己的ODS网关代替SQL Server的客户端 - 在ODS网关中检查。不过,这并不能停止正常的客户端连接SQL Server。在SQL Programmers Toolkit中有一个这样的例, 可以从微软站点免费下载。

3. Write a constantly running/scheduled stored-procedure that checks the relevant column in sysprocesses (net_address), and then issues a KILL command for any processes that should not be running. Note that this only works for MAC addresses. This way allows people to connect and possibly make changes before they are spotted and killed.

    写一个存储过程检查sysprocesses中的相应列(net_address)

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
48#
 楼主| 发表于 2003-12-15 13:03 | 只看该作者
编程管理SQL SERVER的帐号

---摘自《SQL编程技巧站》(文/Water)
每个人都关心数据安全。如果不关心的话,可能没有意识到访问服务器中的敏感数据是非常容易的。因为SQL SERVER在这方面已经替我们考虑过了,所以在我们开发应用程序就可以直接使用SQL SERVER的安全策略。

    在SQL SERVER中,我们可以在ENTERPRISE MANAGER中创建一个登录帐号,并且赋予一定的权限,如果要做到我们的应用程序中呢?

    SQL SERVER提供了如下系统过程

    一、SP_ADDLOGIN    添加登录帐号

        SP_ADDLOGIN login_id[,password[,defaultdb[,defaultlanguage]]]

        login_id          帐号名
        password          口令
        defaultdb         缺省数据库,默认为MASTER数据库。
        defaultlanguage   缺省语言

    二、SP_ADDUSER    添加用户

        SP_ADDUSER login_id[,username[,rolename]]

        username          登录数据库的别名
        rolename          用户隶属的组名

    三、SP_DROPLOGIN  删除帐号

        SP_DROPLOGIN login_id

    四、SP_DROPUSER   删除用户

        SP_DROPUSER username

    五、GRANT         授予用户或组许可权限

        GRANT permission_list ON object_name TO name_list

        permission_list    授予的权限的清单
        object_name        被授予权限的表、视图或存储过程
        name_list          被授予权限的用户或组的清单

    六、REVOKE        收回用户或组许可权限

        REVOKE permission_list ON object_name FROM name_list

    七、SP_PASSWORD   修改口令

        SP_PASSWORD [old_password,]new_password[,login_id]

    前六个过程只能SA或被SA授予Security Administrators权限的人才可使用,第七个过程普通用户可能使用,但不能使用login_id项,只有上述权限的人才可使用此项

 

应用实例:

    添加

        declare @login varchar(6),@pass varchar(11)

        exec sp_addlogin @login,@pass,databasename
        exec sp_adduser @login,@login,public

        grant insert,select,update,delete on table1 to public

    删除        

        revoke insert,delete on table1 from public

        exec sp_dropuser @login
        exec sp_droplogin @login

    本文代码在NT4+SQL7和WIN98+SQL7和NT4+SQL6.5中测试通过

    参考资料:SQL Server 7.0 开发指南

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
49#
 楼主| 发表于 2003-12-15 13:04 | 只看该作者
浅析数据完整性问题

---摘自《ChinaASP网络》
浅 析 数 据 完 整 性 问 题

内 蒙 环 境 信 息 中 心
王 阔 涛
---- 在 开 发C/S 结 构 的 大 型 数 据 库 应 用 软 件 时, 一 般 情 况 下, 软 件 开 发 人 员 和 数 据 库 设 计 人 员 并 不 是 同 一 个 人, 这 就 需 要 协 商 好 一 些 即 可 由 程 序 设 计 人 员 解 决 又 可 由 数 据 库 设 计 人 员 来 解 决 的 问 题, 保 证 数 据 完 整 性 就 是 一 个 这 样 的 问 题。

---- 笔 者 举 一 个 最 简 单 的 例 子: 货 物 出 库、 退 货 的 例 子

---- 这 里 有 库 存 表(kcb)、 出 库 单 表(ckb) 和 退 货 单 表(thb)

---- 库 存 表 包 含 如 下 列:WPBH,KCSL〔 物 品 编 号, 库 存 数 量〕

---- 出 库 单 表 含 如 下 列:WPBH,CKSL〔 物 品 编 号, 出 库 数 量〕

---- 退 货 单 表 含 如 下 列:WPBH,THSL〔 物 品 编 号, 退 货 数 量〕

---- 假 如 我 们 进 行 了 如 下 交 易:

---- 1 . 物 品A 有 十 件 出 库

---- 2 . 物 品A 有 五 件 退 货( 可 再 出 库)

---- 我 们 都 知 道, 这 两 笔 交 易 都 需 要 修 改 库 存 表, 但 修 改 库 存 表 的 工 作 由 谁 来 做。 可 以 肯 定 的 说, 程 序 设 计 人 员 和 数 据 库 设 计 人 员 都 可 以 完 成。

---- 首 先 我 们 举 例 由 程 序 设 计 人 员 如 何 完 成:

---- 1 . 出 库 时, 产 生 新 出 库 记 录 插 入 到 出 库 单 表 中, 同 时 将 库 存 表 中 的KCSL 用KCSL 减 掉 出 库 数 量 的 值 取 代。

---- 2 . 退 货 时, 产 生 新 退 货 记 录 插 入 到 退 货 表 中, 同 时 将 库 存 表 中 的KCSL 用KCSL 加 上 退 货 数 量 的 值 取 代。

---- 由 于 不 同 的 开 发 平 台, 完 成 这 项 工 作 的 代 码 不 尽 相 同, 故 不 写 出 具 体 代 码。

---- 接 下 来 看 看 由 数 据 库 设 计 人 员 是 如 何 完 成 这 项 工 作:

---- 数 据 库 设 计 人 员 完 成 这 项 工 作 靠 的 是 触 发 器。

---- 数 据 库 设 计 人 员 建 立 如 下SQL 语 句 为 出 库 单 表(ckb) 建 立 插 入 触 发 器

CREATE  TRIGGER  FORINSERT
ON   ckb
FOR  INSERT
AS
     UPDATE   kcb
         SET   kcb.kcsl=kcb.kcsl - inserted.cksl
         FROM  inserted
         WHERE  kcb.wpbh=inserted.wpbh

---- 同 样, 也 要 为 退 货 单 表 建 立 类 似 的SQL 语 句

    CREATE  TRIGGER  FORINSERT
ON   thb
FOR  INSERT
AS
     UPDATE   kcb
         SET   kcb.kcsl=kcb.kcsl + inserted.thsl
         FROM  inserted
         WHERE  kcb.wpbh=inserted.wpbh

---- 可 以 很 明 显 地 看 出, 如 果 两 个 人 都 做 了 工 作, 程 序 在 运 行 过 程 中 一 定 会 出 错。

---- 但 这 项 工 作 具 体 应 该 由 谁 来 完 成 ? 我 私 下 认 为, 应 该 由 数 据 库 设 计 人 员 来 完 成, 原 因 如 下:

---- 1、 一 个 可 移 植 性 好 的 软 件 应 该 与 数 据 的 结 构 无 关;

---- 2、 程 序 的 研 制 和 调 试 更 加 简 单, 再 拿 上 例 来 说, 程 序 设 计 人 员 只 需 完 成 往 出 库 单 表 和 退 货 单 表 中 插 入 相 应 的 记 录 工 作 即 可, 具 体 修 改 工 作 由 触 发 器 来 完 成。

---- 3、 触 发 器 的 运 行 是 在 服 务 器 端, 减 轻 了 客 户 端 的 开 销。

---- 4、 触 发 器 不 管 你 在 什 么 时 候 进 行 操 作, 它 都 会 启 动, 保 证 数 据 不 会 出 错。

---- 其 实, 上 文 所 写 的 触 发 器 只 是 一 个 最 简 单 的 例 子, 在 实 际 工 作 中 要 远 远 比 这 复 杂 得 多, 设 计 一 个 好 的 数 据 库 会 花 费 数 据 库 设 计 人 员 很 大 的 心 血, 如 果 只 是 建 立 了 表 格, 工 作 还 没 有 完 成 一 半 呢, 下 一 多 半 工 作 就 是 将 你 的 数 据 完 整 性 问 题 解 决 掉。

---- 成 功 地 设 计 一 个 数 据 库 能 起 到 事 半 功 倍 的 效 果。 数 据 的 完 整 性 已 经 解 决 了, 程 序 设 计 起 来 还 有 什 么 问 题 呢 ?

---- 说 来 容 易, 做 到 却 很 难, 比 者 在 实 际 工 作 中 也 经 常 遇 到 很 多 问 题, 希 望 能 和 众 多 的 同 行 共 同 进 步, 把 你 的 经 验 和 好 的 方 法 告 诉 大 家。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
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
50#
 楼主| 发表于 2003-12-15 13:04 | 只看该作者
读书笔记------得到数据库期望的性能

---摘自《ChinaASP网络》
读书笔记------得到数据库期望的性能

我读书的笔记,拿出来大家没事看看,或者,也是求证于大家之意
以MS sql server 6.5 为例

硬件调整性能
最有可能影响性能的是磁盘,解决办法
1.采用带高速缓冲的RAID阵列磁盘,
2.多I/O通道,多处理器超前读线程      可以提高检索两到三倍
3.较大高速缓冲,使用DBCC PRINTABLE 强制访问频率高的表常驻缓存

软件方法
1.规范化----------加快吞吐速度
2.反规范化-------加快检索速度
3.创建或删除索引
4.分割一个表后放入多个数据库
-----注.好象在7.0中这样没必要做,因为7.0中可以用多个文件存储数据库,然后将其分布到RAID磁盘中去提高响应速度

硬件放法能往往普遍提高性能,而软件方法只能提高某项,几项性能

对与数据库来说,常常会提到三个指标
1.查询的响应速度
2.吞吐量
3.并行处理能力
4.吞吐量和并行处理的结合

DBA工作的一项就是,设法在各个指标中折衷,取得用户满意的指标

最常见的是平衡update 和,select的性能
一般而言,规范化可以提高update性能,反规范化提高select性能

一个特殊的例子,平衡OLTP和DSS的性能
OLTP:联机事务处理程序,大多数数据操作为update,规范化数据库,小容量表,少量精简索引可以提高最佳性能
DSS:   数据仓库系统,对应这些系统,大多是查询操作,高冗余,多索引会提高响应速度

顺便说一下,在SQLserver 7.0中,用 query analyzer 可以很方便分析查询效率
当你的查询响应时间小于一秒时,你恐怕就得注意提高查询速度了

使用道具 举报

回复

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

本版积分规则 发表回复

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