GVKun编程网logo

SqlServer数据库的语句及一些操作整理(sqlserver数据库基本语句)

4

想了解SqlServer数据库的语句及一些操作整理的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于sqlserver数据库基本语句的相关问题,此外,我们还将为您介绍关于C#操作SqlServ

想了解SqlServer数据库的语句及一些操作整理的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于sqlserver数据库基本语句的相关问题,此外,我们还将为您介绍关于C#操作SqlServer数据库的常用对象,及其方法、c#操作sqlserver数据库的简单示例、SQL Server 2000数据库同步 同步两个SQLServer数据库的内容、SQL Server数据库与SQL Server数据库的并发症有不同的排序规则,而不是服务器的默认值?的新知识。

本文目录一览:

SqlServer数据库的语句及一些操作整理(sqlserver数据库基本语句)

SqlServer数据库的语句及一些操作整理(sqlserver数据库基本语句)

临近年终,在工作之余对工作和学习中遇到的问题以及常用的一些知识点做了些整理,以备后用。本文涉及的内容为数据库。

1 对于主键设置了Identity的表,在删除表中数据后再往表中插入数据,Identity列不是从1起始了,如果想删除数据后Indentity列仍从1起始,可以用下面代码来删除数据。

truncate table tablename
DBCC CHECKIDENT(tablename,RESEED,1)

 

2 判断指定表在数据库中是否存在

if exists(select name from sysobjects where name='tablename' and type='u')

 

3 判断指定列在指定表中是否存在

if exists(select * from sys.columns,sys.tables 
      where sys.columns.object_id = sys.tables.object_id
      and sys.tables.name='tablename' and sys.columns.[name]='columnname')

 

4 在编写代码生成器之类的程序的时候,通常需要取出数据库中所有的表名以及表中字段的一些基本信息,如字段长度、字段类型、描述等。实现上面要求的sql语句如下:

--取数据库中表的集合
select * from sysobjects where xtype='u' order by name

--取表中字段的一些基本信息
select 
    sys.columns.name,--字段名
    sys.types.name as typename,--字段类型
    sys.columns.max_length,--字段长度
    sys.columns.is_nullable,--是否可空
    (select 
        count(*) 
    from 
        sys.identity_columns 
    where 
        sys.identity_columns.object_id = sys.columns.object_id 
    and 
        sys.columns.column_id = sys.identity_columns.column_id
    ) as is_identity ,--是否自增

    (select 
        value 
    from 
        sys.extended_properties 
    where 
        sys.extended_properties.major_id = sys.columns.object_id 
    and 
        sys.extended_properties.minor_id = sys.columns.column_id
    ) as description  --注释
from 
    sys.columns,sys.tables,sys.types
where 
    sys.columns.object_id = sys.tables.object_id 
and 
    sys.columns.system_type_id=sys.types.system_type_id 
and 
    sys.tables.name='tablename'
order by sys.columns.column_id

 

5 在存储过程中使用事务

create procedure procname
as
begin tran  
    --执行sql语句

if @@ERROR!=0  
begin  
    rollback tran   --失败
end  
else  
begin  
    commit tran   --成功
end  

 

6 清除数据库日志

DUMP TRANSACTION DatabseName WITH NO_LOG
BACKUP LOG DatabseName WITH NO_LOG 
DBCC  SHRINKFILE(DatabseLogName,1) 
--DatabseName为数据库名称
--DatabseLogName为日志文件名,可以通过下面语句得到
--select name from sysfiles 

 

还有一种比较简单的方法是分离数据库,删除日志文件,再附加数据库,这样产生的日志文件只有500多k。

下面介绍几个常用的系统存储过程和函数

7 db_name()  得到数据库名称

select db_name()    
Test
(1 行受影响)

 

8 object_id 可以得到对象在系统中的编号,对象包括表、视图、存储过程等。如果不存在返回null,所以也可以用来判断表是否存在。

select object_id('objectname')
--判断表是否存在
if  object_id('tablename') is not null

 

9 sp_helptext 用来得到视图、存储过程等对象的文本,可以很快速找到,不过会改变视图或存储过程的格式。所以这个系统存储过程我通常都是用来查看,如果要修改一个存储过程我还是会通过树形菜单去找到存储过程然后修改保存。

sp_helptext 'objectname'

 

10 parsename,可以得到对象名称的指定部分,该函数有两个参数,第一个为对象名称,第二个为指定部分的代号。

select parsename('oec2003.databasename.dbo.tablename',1)    
--对象名称返回tablename
select parsename('oec2003.databasename.dbo.tablename',2)    
--Schema名称返回dbo
select parsename('oec2003.databasename.dbo.tablename',3)    
--数据库名称返回databasename
select parsename('oec2003.databasename.dbo.tablename',4)    
--服务器名称返回oec2003

 

先就写这么多吧,后面整理出来的会陆续补上

C#操作SqlServer数据库的常用对象,及其方法

C#操作SqlServer数据库的常用对象,及其方法

首先放出所常用的对象:

System.Data.SqlClient.SqlConnection

System.Data.SqlClient.SqlCommand

System.Data.SqlClient.SqlDataAdapter

SqlConnection对象用于连接SqlServer数据库,SqlCommand对象用于执行sql语句,至于SqlDataAdapter对象,后面再说。

一、SqlConnection对象

先看代码:

string strConn = "server=''(local)'';database=''mydatabase'';uid=''root'';pwd=''123456''";//编写需要连接的数据库信息,一般这个会在Web.Config文件配置
SqlConnection conn = new SqlConnection(strConn); //创建连接对象
conn.Open();//打开连接

很容易理解,会将上面代码写成:

string strConn = "server=''(local)'';database=''mydatabase'';uid=''root'';pwd=''123456''";//编写需要连接的数据库信息,一般这个会在Web.Config文件配置
using(SqlConnection conn = new SqlConnection(strConn)){ //创建连接对象
    try{    
        conn.Open();//打开连接
    }catch(Exception e){
        //anything
    }finally{
        conn.Close();
    }
}

SqlConnection对象就是只起到连接数据库作用。

二、SqlCommand对象

SqlCommand对象用于数据的增删改查操作,所以下面介绍SqlCommand类下面的一些方法:

1、ExecuteNonQuery(); 

  ExecuteNonQuery(),看方法名字有Non,可以联想到其可能没有返回值。其实它的返回值类型为int型。当select操作时,返回-1;当执行增加,删除,修改数据时,返回影响的行数。(PS,此方法意义在于执行数据的增、删、改操作)

2、ExecuteReader();

  ExecuteReader(),该方法用于数据的查询,执行后的返回值类型是SqlDataReader,可以通过SqlDataReader对象下面的Read()方法来对数据集进行遍历,有两种提取数据的手段:SqlDataReader对象["列名"].ToString()SqlDataReader对象[索引].ToString()(这里的索引值从0开始)

代码例子:

string strConn = "server=''(local)'';database=''mydatabase'';uid=''root'';pwd=''123456''";//编写需要连接的数据库信息,一般这个会在Web.Config文件配置
using(SqlConnection conn = new SqlConnection(strConn)){ //创建连接对象
    try{    
        conn.Open();//打开连接
        string strSql = "select * from student_tb";//编写sql语句
        SqlCommand sc = new SqlCommand(strSql, conn);//创建SqlCommand对象
        SqlDataReader reader = cmd.ExecuteReader(); //执行sql语句
        while(reader.Read()){//遍历查询到的数据集
            int id = int.Parse(reader[0].ToString());//通过索引得到该列的值
        }
    }catch(Exception e){
        //anything
    }finally{
        conn.Close();
    }
}

3、ExecuteScaler(); 

  它的返回值类型是Object类型。也是用于查询,只有确定查询之后的结果只有一个值得情况下,可以使用此方法。

string strConn = "server=''(local)'';database=''mydatabase'';uid=''root'';pwd=''123456''";//编写需要连接的数据库信息,一般这个会在Web.Config文件配置
using(SqlConnection conn = new SqlConnection(strConn)){ //创建连接对象
    try{    
        conn.Open();//打开连接
        string strSql = "select stu_name from student_tb";//编写sql语句
        SqlCommand sc = new SqlCommand(strSql, conn);//创建SqlCommand对象
        string stuId = (string)cmd.ExecuteScaler(); //执行sql语句
        
    }catch(Exception e){
        //anything
    }finally{
        conn.Close();
    }
}

三、SqlDataAdapter对象 

上面的查询方法在处理少量返回数据时非常方便,但遇到需要处理大量返回数据集时,那么需要用到SqlDataAdapter对象。

SqlDataAdapter类提供多个构造方法:

1、SqlDataAdapter(strSql,strConn) ,strSql为字符串形式sql语句,strConn跟上面代码中的strConn变量一样

2、SqlDataAdapter(strSql, conn) ,strSql为字符串形式sql语句,conn为SqlConnection对象

3、SqlDataAdapter(cmd) , cmd为SqlCommand对象

我们常常使用SqlDataAdapter来填充一个数据表,其中可以有两种操作,可以填充DataSet对象,也可以填充DataTable对象。

string strConn = "server=''(local)'';database=''mydatabase'';uid=''root'';pwd=''123456''";//编写需要连接的数据库信息,一般这个会在Web.Config文件配置
using(SqlConnection conn = new SqlConnection(strConn)){ //创建连接对象
    try{    
        conn.Open();//打开连接
        string strSql = "select * from student_tb";//编写sql语句
        SqlCommand sc = new SqlCommand(strSql, conn);//创建SqlCommand对象
        SqlDataAdapter sda = new SqlDataAdapter(sc);
        DataSet ds = new DataSet();
        sda.Fill(ds);
        //DataTable dt = new DataTable();
        //sda.Fill(dt);
    }catch(Exception e){
        //anything
    }finally{
        conn.Close();
    }
}

其实SqlDataAdapter内部通过SqlDataReader获取数据,而默认情况下SqlDataReader不能获知其查询语句对应的数据库表名,所以上面代码会在DataSet中创建一个新的DataTable,这个新的DataTable会拥有名为返回数据的相应列名,但是DataTable对象的名称是Table,我们有时想得到的table名是我们自定义的,则可以添加:

 

//创建SqlDataAdapter对象之后,创建DataSet对象之前,“Table”是默认的Table对象名
sda.TableMappings.Add("Table""MyTableName");

 

或者,直接使用Fill()方法的重载:

sda.Fill(ds, "MyTableName");

以上就是本次总结c#操作SqlServer常用的类和方法,记录下来,方便以后可以查阅。

 

c#操作sqlserver数据库的简单示例

c#操作sqlserver数据库的简单示例

1.在用windows模式登陆sql server 数据库 简历一个student的数据库,然后新建查询:

复制代码 代码如下:

create table student
(
 id     int  auto_increment  primary key,
 name char(10) not null,
 sex    char(10) not null,
 age   char(10) not null,  
)

2.在vs中新建一个项目,输入一下代码:

复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.sqlClient;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string connSting;
            connSting = "server=localhost;database=student;Integrated Security=True ";
            sqlConnection sConn = new sqlConnection(connSting);
            try
            {
                sConn.open();
            }
            catch (Exception ex)
            {
                Console.WriteLine("链接错误:" + ex.Message);
            }
            string sqlMessage=null;
            sqlMessage = "select * from student";
            sqlCommand sCmd = new sqlCommand(sqlMessage,sConn);

            sqlDataReader sdr = null;
            try
            {
                sdr = sCmd.ExecuteReader();

                Console.WriteLine(" 姓名   性别   年龄 ");
                while (sdr.Read())
                {
                    Console.WriteLine(sdr["name"] +""+ sdr["sex"]+"" + sdr["age"]);
                }
                sConn.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }
}

3.运行结果将会显示数据库中的数据

SQL Server 2000数据库同步 同步两个SQLServer数据库的内容

SQL Server 2000数据库同步 同步两个SQLServer数据库的内容

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!

复制前要做好的准备工作:

  1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
  我的电脑
  控制面板
  管理工具
  计算机管理
  用户和组
  右键用户
  新建用户
  建立一个隶属于administrator组的登陆windows的用户

  2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:

  我的电脑
  D:\ 新建一个目录,名为: PUB
  右键这个新建的目录
  属性  共享
  选择共享该文件夹
  通过权限按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
  确定


  3.设置sql代理(sqlSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)

  开始  程序  管理工具  服务
  右键sqlSERVERAGENT
  属性  登陆  选择此账户
  输入或者选择第一步中创建的windows登录用户名
  密码中输入该用户的密码

  4.设置sql Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)

  企业管理器
  右键sql实例  属性
  安全性  身份验证
  选择sql Server 和 Windows
  确定

  5.在发布服务器和订阅服务器上互相注册
  企业管理器
  右键sql Server组
  新建sql Server注册...
  下一步  可用的服务器中,输入你要注册的远程服务器名  添加
  下一步  连接使用,选择第二个sql Server身份验证
  下一步  输入用户名和密码
  下一步  选择sql Server组,也可以创建一个新组
  下一步  完成

  6.对于只能用IP,不能用计算机名的,为其注册服务器别名
  (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
  开始  程序  Microsoft sql Server  客户端网络实用工具
  别名  添加
  网络库选择TCP/IP  服务器别名输入sql服务器名
  连接参数  服务器名称中输入sql服务器ip地址
  如果你修改了sql的端口,取消选择动态决定端口,并输入对应的端口号


  sql数据库同步复制

  一、建立发布和分发服务器

[欢迎使用配置发布和分发向导]->[选择分发服务器]

->[使@servername成为它自己的分发服务器,sql Server将创建分发数据库和日志]

->[制定快照文件夹]-> [自定义配置] -> [否,使用下列的默认配置] -> [完成]

上述步骤完成后,会在当前@servername sql Server数据库里建立了一个distribion库和

一个distributor_admin管理员级别的用户(我们可以任意修改密码)

服务器上新增加了四个作业:
[ 代理程序历史记录清除: distribution ]
[ 分发清除: distribution ]
[ 复制代理程序检查 ]
[ 重新初始化存在数据验证失败的订阅 ]

sql Server企业管理器里多了一个复制监视器,当前的这台机器就可以发布、分发、订阅了。

我们再次在sql Server企业管理器里[复制]-> 右键选择
->[配置发布、订阅服务器和分发],可以看到类似下图:



我们可以在 [发布服务器和分发服务器的属性] 窗口
-> [发布服务器] -> [新增] -> [确定]
-> [发布数据库] -> [事务]/[合并] -> [确定]
-> [订阅服务器] -> [新增] -> [确定]
把网络上的其它sql Server服务器添加成为发布或者订阅服务器.
新增一台发布服务器的选项:

我这里新建立的JIN001发布服务器是用管理员级别的数据库用户test连接的,
到发布服务器的管理链接要输入密码的可选框,默认的是选中的,
在新建的JIN001发布服务器上建立和分发服务器FENGYU/FENGYU的链接的时需要输入distributor_admin用户的密码
到发布服务器的管理链接要输入密码的可选框,也可以不选,
也就是不需要密码来建立发布到分发服务器的链接(这当然欠缺安全,在测试环境下可以使用)

二、新建立的网络上另一台发布服务器(例如JIN001)选择分发服务器

[欢迎使用配置发布和分发向导]->[选择分发服务器]

-> 使用下列服务器(选定的服务器必须已配置为分发服务器) -> [选定服务器](例如FENGYU/FENGYU)

-> [下一步] -> [输入分发服务器(例如FENGYU/FENGYU)的distributor_admin用户的密码两次]

-> [下一步] -> [自定义配置] -> [否,使用下列的默认配置]

-> [下一步] -> [完成] -> [确定]

建立一个数据库复制发布的过程:

[复制] -> [发布内容] -> 右键选择 -> [新建发布]

-> [下一步] -> [选择发布数据库] -> [选中一个待发布的数据库]

-> [下一步] -> [选择发布类型] -> [事务发布]/[合并发布]
-> [下一步] -> [指定订阅服务器的类型] -> [运行sql Server 2000的服务器]

-> [下一步] -> [指定项目] -> [在事务发布中只可以发布带主键的表] -> [选中一个有主键的待发布的表]

->[在合并发布中会给表增加唯一性索引和 ROWGUIDCOL 属性的唯一标识符字段[rowguid],默认值是newid()]

(添加新列将: 导致不带列列表的 INSERT 语句失败,增加表的大小,增加生成第一个快照所要求的时间)

->[选中一个待发布的表]

-> [下一步] -> [选择发布名称和描述] ->

-> [下一步] -> [自定义发布的属性] -> [否,根据指定方式创建发布]

-> [下一步] -> [完成] -> [关闭]

发布属性里有很多有用的选项:设定订阅到期(例如24小时)

设定发布表的项目属性:

常规窗口可以指定发布目的表的名称,可以跟原来的表名称不一样。

下图是命令和快照窗口的栏目

( sql Server 数据库复制技术实际上是用insert,update,delete操作在订阅服务器上重做发布服务器上的事务操作

看文档资料需要把发布数据库设成完全恢复模式,事务才不会丢失

但我自己在测试中发现发布数据库是简单恢复模式下,每10秒生成一些大事务,10分钟后再收缩数据库日志,
这期间发布和订阅服务器上的作业都暂停,暂停恢复后并没有丢失任何事务更改 )

发布表可以做数据筛选,例如只选择表里面的部分列:

例如只选择表里某些符合条件的记录,我们可以手工编写筛选的sql语句:

发布表的订阅选项,并可以建立强制订阅:


成功建立了发布以后,发布服务器上新增加了一个作业: [ 失效订阅清除 ]

分发服务器上新增加了两个作业:
[ JIN001-dack-dack-5 ] 类型[ REPL快照 ]
[ JIN001-dack-3 ] 类型[ REPL日志读取器 ]

上面蓝色字的名称会根据发布服务器名,发布名及第几次发布而使用不同的编号

REPL快照作业是sql Server复制的前提条件,它会先把发布的表结构,数据,索引,约束等生成到发布服务器的OS目录下文件
(当有订阅的时候才会生成,当订阅请求初始化或者按照某个时间表调度生成)

REPL日志读取器在事务复制的时候是一直处于运行状态。(在合并复制的时候可以根据调度的时间表来运行)

建立一个数据库复制订阅的过程:

[复制] -> [订阅] -> 右键选择 -> [新建请求订阅]

-> [下一步] -> [查找发布] -> [查看已注册服务器所做的发布]

-> [下一步] -> [选择发布] -> [选中已经建立发布服务器上的数据库发布名]

-> [下一步] -> [指定同步代理程序登录] -> [当代理程序连接到代理服务器时:使用sql Server身份验证]
(输入发布服务器上distributor_admin用户名和密码)

-> [下一步] -> [选择目的数据库] -> [选择在其中创建订阅的数据库名]/[也可以新建一个库名]

-> [下一步] -> [允许匿名订阅] -> [是,生成匿名订阅]

-> [下一步] -> [初始化订阅] -> [是,初始化架构和数据]

-> [下一步] -> [快照传送] -> [使用该发布的默认快照文件夹中的快照文件]
(订阅服务器要能访问发布服务器的REPLDATA文件夹,如果有问题,可以手工设置网络共享及共享权限)

-> [下一步] -> [快照传送] -> [使用该发布的默认快照文件夹中的快照文件]

-> [下一步] -> [设置分发代理程序调度] -> [使用下列调度] -> [更改] -> [例如每五分钟调度一次]

-> [下一步] -> [启动要求的服务] -> [该订阅要求在发布服务器上运行sqlServerAgent服务]

-> [下一步] -> [完成] -> [确定]

成功建立了订阅后,订阅服务器上新增加了一个类别是[REPL-分发]作业(合并复制的时候类别是[REPL-合并])
它会按照我们给的时间调度表运行数据库同步复制的作业

三、sql Server复制配置好后,可能出现异常情况的实验日志:

1.发布服务器断网,sql server服务关闭,重启动,关机的时候,对已经设置好的复制没有多大影响

中断期间,分发和订阅都接收到没有复制的事务信息

2.分发服务器断网,对已经设置好的复制有一些影响

中断期间,发布服务器的事务排队堆积起来
(如果设置了较长时间才删除过期订阅的选项,繁忙发布数据库的事务日志可能会较快速膨胀),

订阅服务器会因为访问不到发布服务器,反复重试
我们可以设置重试次数和重试的时间间隔(最大的重试次数是9999,如果每分钟重试一次,可以支持约6.9天不出错)

分发服务器sql server服务启动,网络接通以后,发布服务器上的堆积作业将按时间顺序作用到订阅机器上:

会需要一个比较长的时间(实际上是生成所有事务的insert,delete语句,在订阅服务器上去执行)
我们在普通的PC机上实验的58个事务100228个命令执行花了7分28秒.

3.订阅服务器断网,对已经设置好的复制影响比较大,可能需要重新初试化

我们实验环境(订阅服务器)从18:46分意外停机以,第二天8:40分重启动后,
已经设好的复制在8:40分以后又开始正常运行了,发布服务器上的堆积作业将按时间顺序作用到订阅机器上
但复制管理器里出现快照的错误提示,快照可能需要重新初试化,复制可能需要重新启动.
(我们实验环境的机器并没有进行快照初试化,复制仍然是成功运行的)

四、删除已经建好的发布和定阅可以直接用delete删除按钮

我们最好总是按先删定阅,再删发布,最后禁用发布的顺序来操作。

如果要彻底删去sql Server上面的复制设置,可以这样操作:

[复制] -> 右键选择 [禁用发布] -> [欢迎使用禁用发布和分发向导]

-> [下一步] -> [禁用发布] -> [要在@servername上禁用发布]

-> [下一步] -> [完成禁用发布和分发向导] -> [完成]

我们也可以用T-sql命令来完成复制中发布及订阅的创建和删除,选中已经设好的发布和订阅,按属标右键
可以[生成sql脚本]。(这里就不详细讲了,后面推荐的网站内有比较详细的内容)

当你试图删除或者变更一个table时,出现以下错误
Server: Msg 3724,Level 16,State 2,Line 1
Cannot drop the table object_name because it is being used for replication.

比较典型的情况是该table曾经用于复制,但是后来又删除了复制

处理办法:

代码如下:

 
select * from sysobjects where replinfo >0 
sp_configure allow updates,1 
go 
reconfigure with override 
go 
begin transaction 
update sysobjects set replinfo = 0 where replinfo >0 
commit transaction 
go 
rollback transaction 
go 
sp_configure allow updates,0 
go 
reconfigure with override 
go 




疑问:
在合并复制配置完全后,如果同步代理停止了。我要在程序中去重新启动合并复制的同步代理。请问使用什么命令或存储过程呢?
解决办法:
sp_start_job
指示 sql Server 代理程序立即执行作业。

示例
下例启动名为 Nightly Backup 的作业。

USE msdb
EXEC sp_start_job @job_name = Nightly Backup


2、日志还原功能、、、
 

代码如下:

 
说明: 
下面的代码演示了如何利用日志还原功能,将主数据库中的数据变化及时反馈到备用数据库中 
备用数据库的数据可以随时用于查询,但不能被更新(备用数据库只读)。 

首先,创建一个演示用的数据库(主数据库) 
CREATE DATABASE Db_test 
ON 
( NAME = Db_test_DATA,FILENAME = c:\Db_test.mdf ) 
LOG ON 
( NAME = Db_test_LOG,FILENAME = c:\Db_test.ldf) 
GO 

对数据库进行备份 
BACKUP DATABASE Db_test TO disK=c:\test_data.bak WITH FORMAT 
GO 

把数据库还原成备用数据库(演示主数据库与这个备用数据库之间的同步) 
RESTORE DATABASE Db_test_bak FROM disK=c:\test_data.bak 
WITH REPLACE,STANDBY=c:\db_test_bak.ldf,MOVE Db_test_DATA TO c:\Db_test_data.mdf,MOVE Db_test_LOG TO c:\Db_test_log.ldf 
GO 

启动 sql Agent 服务 
EXEC master..xp_cmdshell net start sqlserveragent,no_output 
GO 

创建主服务器数据训与备用服务器数据库之间同步的作业 
DECLARE @jogid uniqueidentifier 
EXEC msdb..sp_add_job 
@job_id = @jogid OUTPUT,@job_name = N数据同步处理 

创建同步处理步骤 
EXEC msdb..sp_add_jobstep 
@job_id = @jogid,@step_name = N数据同步,@subsystem = Tsql,@command = N 
主数据库中进行日志备份 
BACKUP LOG Db_test TO disK=c:\test_log.bak WITH FORMAT 

备用数据库中还原主数据库的日志备份(应用主数据库中的最新变化 
实际应该时主数据库备份与备用数据库的还原作业应该分别在主服务器和备用服务器上建立,并且备份文件应该放在主服务器和备用都能访问的共享目录中 
RESTORE LOG Db_test_bak FROM disK=c:\test_log.bak WITH STANDBY=c:\test_log.ldf,@retry_attempts = 5,@retry_interval = 5 

创建调度(每分钟执行一次) 
EXEC msdb..sp_add_jobschedule 
@job_id = @jogid,@name = N时间安排,@freq_type=4,@freq_interval=1,@freq_subday_type=0x4,@freq_subday_interval=1,@freq_recurrence_factor=1 

添加目标服务器 
EXEC msdb.dbo.sp_add_jobserver 
@job_id = @jogid,@server_name = N(local) 
GO 

通过上述处理,主数据库与备用数据库之间的同步关系已经设置完成 
下面开始测试是否能实现同步 

在主数据库中创建一个测试用的表 
CREATE TABLE Db_test.dbo.TB_test(ID int) 
GO 

等待1分钟30秒(由于同步的时间间隔设置为1分钟,所以要延时才能看到效果) 
WAITFOR DELAY 00:01:30 
GO 

查询一下备用数据库,看看同步是否成功 
SELECT * FROM Db_test_bak.dbo.TB_test 

结果: 
ID 
- 

(所影响的行数为 0 行) 


测试成功 
GO 

最后删除所有的测试 
DROP DATABASE Db_test,Db_test_bak 
EXEC msdb..sp_delete_job @job_name=N数据同步处理 
GO 


=========================================================== 

服务器档机处理说明 
使用这种方式建立的数据库同步,当主数据库不可用时(例如,主数据库损坏或者停机检修) 
可以使用以下两种方法使备用数据库可用。 



1. 如果主数据库损坏,无法备份出最新的日志,可以直接使用下面的语句使备用数据库可读写(丢失最近一次日志还原后的所有数据)。
RESTORE LOG Db_test_bak WITH RECOVERY


2. 如果主数据库可以备份出最新日志,则可以使用下面的语句。
先备份主数据库的最新的事务日志
BACKUP LOG Db_test TO disK=c:\test_log.bak WITH FORMAT
再在备用数据库中恢复最新的事务日志,并且使备用数据库可读写(升级为主数据库)
RESTORE LOG Db_test_bak FROM disK=c:\test_log.bak

简单地说:
1. 你的sql服务要使用指定的windows用户登陆,而不能使用本地系统帐户
2. 用于登陆sql服务的用户要求对共享目录具有所有权限
3. 如果你的电脑没有加入到域,还必须保证源和目标服务器的sql服务设置的登陆用户是一样的(用户名和密码都一样)

网络备份主要是权限设置问题,参考下面的备份文件共享目录权限设置方法去解决目录的共享权限就可以了

下面假设是假设A服务器上的数据库备份到B服务器上的共享目录权限设置(两台服务器应该在局域网内,允许目录共享访问)::

1.机器A,B创建一个同名的windows用户,用户组设置为administrators,做为备份文件夹文件夹的有效访问用户,操作:
我的电脑
控制面板
管理工具
计算机管理
用户和组
右键用户
新建用户
建立一个隶属于administrator组的登陆windows的用户

2.在B机器器上,做为备份文件的存放目录,操作:
我的电脑D:\ 新建一个目录,名为: BAK
右键这个新建的目录
属性共享
选择共享该文件夹
通过权限按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
确定


3.设置 MSsqlSERVER 及 sqlSERVERAGENT 服务的启动用户
开始程序管理工具服务
右键 MSsqlSERVER
属性登陆选择此账户
输入或者选择第一步中创建的windows登录用户名
密码中输入该用户的密码
确定
同样的方法设置 sqlSERVERAGENT

4.在A机器上完成对B机器BAK目录的映射

5.查询分析器中执行下面的语句,检验是否成功:
exec master..xp_cmdshell dir 映射的盘符

6.A服务器上做备份计划

备注:创建一个新的用户只是为了让MSsqlSERVER服务的启动帐户与共享目录的有效访问同名且密码相同,这样才能通过验证(所以你也可以用其他有效的用户来代替,只需要满足用户名和密码相同,并且拥有足够的权限)

SQL Server数据库与SQL Server数据库的并发症有不同的排序规则,而不是服务器的默认值?

SQL Server数据库与SQL Server数据库的并发症有不同的排序规则,而不是服务器的默认值?

我们正在将数据库从旧的sql Server 2k EE服务器迁移到默认排序规则“latin1_General_CI_AS”到新的sql Server 2005& 2008服务器,默认排序规则为“sql_latin1_General_CP1_CI_AS”.没有国际字符需要我所知的Unicode,所以两个代码页在实际上几乎是一样的.

主sql Server DBA坚持认为,每个单个数据库(大部分由第三方应用程序构建)必须使用新的排序规则进行重新构建,然后才能迁移它们.

我知道自从sql Server 2000以来,可以将单个数据库设置为不同于默认的排序规则.但混合整理运行的真正后果是什么?例如,One article from Microsoft建议使用共享tempdb的并发症(但是可以轻松避免吗?).

而且,也许更重要的是,如果我们需要在新服务器上支持多个排序规则,我们可以采取什么措施来避免这些问题?

解决方法

好的,不是最好的答案,但是

你问:“用不同的归档运行的真正后果是什么”
这可能是头痛.微软提到的文章指出了它的头脑.在我个人的经验中,我遇到了这个问题,这是不容易避免的.
不符合要求的排序规则将弹出无计划的地方,除非您测试好.

您还问:“如果我们需要在新服务器上支持多个排序规则,我们可以采取什么措施来避免这些问题?”
没有什么可想而知,除了测试像疯了.

我真的希望你运气,这可能是一个常见的毛茸茸的问题,我不希望任何人.

关于SqlServer数据库的语句及一些操作整理sqlserver数据库基本语句的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于C#操作SqlServer数据库的常用对象,及其方法、c#操作sqlserver数据库的简单示例、SQL Server 2000数据库同步 同步两个SQLServer数据库的内容、SQL Server数据库与SQL Server数据库的并发症有不同的排序规则,而不是服务器的默认值?的相关知识,请在本站寻找。

本文标签:

上一篇获取sqlserver数据库中所有库、表、字段名的方法(获取sql语句中所有表名)

下一篇SqlServer数据库的语句及一些操作整理(sqlserver数据库基本语句)