利用企业管理器可以完成的操作有 :
管理SQL Server 服务器;建立与管理数据库;建立与管理表、视图、存储过程、触发程序、角色、规则、默认值等数据库对象,以及用户定义的数据类型;备份数据库和事务日志、恢复数据库;复制数据库;设置任务调度;设置警报;提供跨服务器的拖放控制操作;管理用户帐户;建立Transact-SQL命令语句以及管理和控制SQL Mail
图:SQL Server 企业管理器(Enterprise Manager)界面
服务管理器(Service Manager)
SQL Server 服务管理器是在服务器端实际工作时最有用的实用程序,其界面如图1-21所示。服务管理器用来启动、暂停、继续和停止数据库服务器的实时服务,其提供的服务包括:SQL Server、SQL Server Agent、MSDTC(Microsoft Distributed Transaction Coordinator,微软分布式事务协调器)
图:SQL Server 服务管理器(Service Manager)界面
查询分析器(Query Analyzer)
SQL Server 2000新的图形化查询分析器用于输入和执行Transaction-SQL语句,并且迅速查看这些语句的结果,以分析和处理数据库中的数据。这是一个非常实用的工具,对掌握SQL语言,深入理解SQL Server的管理工作有很大帮助
导入和导出数据(Imput and Export Data)
导入和导出数据采用DTC 导入/导出向导来完成。此向导包含了所有的DTC(Data Transformation Services)工具,提供了在OLE DB数据源之间复制数据的最简捷的方法
创建表和视图主要SQL语句:
1. CREATE DATABASE database_name [WITH LOG IN “pathname”]
创建数据库。database_name:数据库名称。“pathname”:事务处理日志文件。
如:select dirpath form systables where tabtype = “L”;
例:create databse customerdb with log in “/usr/john/log/customer.log”;
2. DATABASE databse-name [EXCLUSIVE]
database_name:数据库名称。EXCLUSIVE:独占状态。
存取当前目录和DBPATH中指定的目录下的数据库,事务中处理
过程中不要使用此语句。
例:dtabase customerdb;
3. CLOSE DATABASE 关闭当前数据库。
database_name:数据库名称。
此语句之后,只有下列语句合法:CREATE DATABASE; DATABASE; DROP DATABSE; ROLLFORWARD DAT
ABASE;删除数据库前必须使用此语句。
例:close database;
? DROP DATABASE database_name
删除指定数据库。
database_name:数据库名称。
用户是DBA或所有表的拥有者;删除所有文件,但不包括数据库目录;不允许删除当前数据库(须先关闭当前数据库);事务中处理过程中不能使用此语句,通过ROLLBACK WORK 也不可将数据库恢复。
例:drop databse customerdb;
? CREATE [TEMP] TABLE table-name (column_name datatype [NOT NULL], …)
[IN “pathname”]
创建表或临时表。
table-name :表名称。
column_name:字段名称。
data-type:字段数据类型。
path-name:指定表的存放位置
TEMP用于指定建立临时表;表名要唯一,字段要唯一;有CONNECT权限的用户可建立临时表;创建的表缺省允许CONNECT用户存取,但不可以ALTER
例:create table user
( c0 serial not null, c1 char (10),
c2 char(2),
c3 smallint,
c4 decimal(6,3),
c5 date
) in “usr/john/customer.dbs/user;
? ALTER TABLE
ALTER TABLE table-name
{ADD (newcol_name newcol_type [BEFORE oldcol_name], …) | DROP (oldcol_name, …)
| MODIFY (oldcol_name newcol_type [NOT NULL], … )}, …
修改表结构。
table-name:表名称。
newcol_name:新字段名称
newcol_type:新字段类型
oldcol_name:老字段名称
可以使用单个或多个ADD子句、DROP子句、MODIFY子句,但某个字句失败,操作即中止;原字段是NULL,不允许MODIFY为NOT NULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。
例:alter table user
add ( c6 char(20) before c5);
? RENAME TABLE oldname TO newname
修改表名。
oldname:原名称。
newname:新名称。
RENAME使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。
例:rename user to bbb;
? DROP TABLE table-name
删除表。
table-name:表名称。
删除表意味着删除其中所有数据、各字段上的索引及对表的赋权、视图等;用户不能删除任何系统目录表;语句使用者是表拥有者或拥有DBA权限,事务中处理过程中不要使用此语句。
? RENAME COLUMN table.oldcolumn, TO newcolumn
修改字段名。
table.oldcolumn:表名及原字段名称
newcolumn:新字段名称。
语句使用者是表的拥有者或拥有DBA权限或有ALTER权限的用户,事务中处理过程中不要使用此语句。
例:rename column user.c6 to c7;
? CREATE VIEW view-name column-list
CREATE VIEW view-name column-list AS select_statement [WITH CHECK OPTION]
创建视图。
view-name:视图名称。
column-list:字段列表。
select_statement:SELECT语句。
以下语句不使用视图:ALTER TABLE,DROP INDEX,ALTER INDEX,LOCK TABLE,CREATE INDEX, RENAME TABLE;视图将延用基表的字段名,对表达式等虚字段和多表间字段重名必须指明标识其字段名;若对视图中某些字段命名,则所有字段都必须命名;视图中数据类型延用基表中的数据类型,虚字段起诀于表达式;不能使用ORDER BY和UNION子句;对视图中所有的字段要有SELECT权限;事务中处理过程中使用此语句,即使事务回滚,视图也将建立,不能恢复。
例:create view v_user as select * from user where c1 = “B1”;
? DROP VIEW view-name
删除视图。
view-name:视图名称。
用户可删除自己建立的视图;视图的后代视图也被删除;事务中处理中不要使用此语句。
例:drop view v_user
表数据操作包括数据的插入、修改和删除
一、插入数据
在向表中添加数据时应该注意两点:第一是用户权限,只有sysadmin角包成员、数据库和数据库对
象所有者及其授权用户才有权限向表中添加数据;第二是数据格式,对于不同的数据类型,插入数据的
格式也不一样,应严格遵守它们各自的格式要求。
Transact-SQL语言中用INSERT语句向表或视图中插入新的数据行。INSERT语句的语法格式为:
INSERT [INTO] table_source
{[column_list]
VALUES ({DEFAULT | constant_expression} [,…n])
|DEFAULT VALUES
|select_statement
|execute_statement
}
}
其中,column_list参数为新插入数据行中一列或多列列名列表,它说明INSERT 语句只为指定列插
入数据。在给表或视中部分列插入数据时,必须使用列名列表方式指出这部分列名。其余未指定列的列
值要根据它们的默认值和空值属性情况而定,它们有以下几种可能取值:
(1)对于timestamp列或具有IDENTITY属性列,它们的列值由SQL Server计算后自动赋值。
(2)如果这些列有默认值或关联有默认数据库对象,插入新列时,它们的值为默认值。
(3)当这些列没有默认值设置时,但它们允许空值时,该列值为空。
(4)当这些列既没有默认值设置,也不允许空值时,SQL Server在执行INSERT 语句时将产生错误,
导致插入操作失败。
当未指定column_list 参数时,为各列所提供的数据顺序应严格按照表中各列的定义顺序,而使用
column_list参数则可以调整向表中所插入数据的列顺序,只要VALUES子句所提供的数据顺序与column_
list参数中指定的列顺序相同即可。
VALUES子句为新插入行中column_list 参数所指定列提供数据,这些数据可以以常量表达式形式提
供,或使用DEFAULT关键字说明向列中插入其默认值。
DEFAULT VALUES说明向表中所有列插入其默认值。对于具有INDENTITY 属性或timestamp 数据类型
列,系统将自动插入下一个适当值。对于没有设置默认值的列,如果它们允许空值,SQL Server将插入
null,否则返回一错误消息。
select_statement是标准的数据库查询语句,它是SQL Server为INSERT语句所提供的又一种数据插
入方式。INSERT语句将select_statement子句所返回的结果集合数据插入到指定表中。查询语句结果集
合每行中的数据数量、 数据类型和排列顺序也必须与表中所定义列或 column_list 参数中指定列的数
量、数据类型和排列顺序完全相同。
SQL Server为INSERT语句提供的第四种数据插入方式是通过执行系统存储过程,其数据来自于过程
执行后所产生的结果集合。所执行的过程可以为存储过程、系统存储过程或扩展存储过程,它们既可以
为本地存储过程,又可以是远程服务器上的存储过程,只要用户具有它们的执行权限即可。有关存储过
程请参阅对应的内容。
table_source说明INSERT语句插入数据时所操作的表或视图,其语法格式可简单书写为:
{table_name [[AS] table_alias]
| view_name [[AS] table_alias]
}
table_name和view_name说明***入数据的表或视图名称,table_alias参数为表或视图设置别名。
使用别名有两方面原因:第一、当表或视图名称较长时,使用别名可以简化书写工作;第二,在自连接
或子查询中,使用别名可以区别同一个表或视图。
在向表中插入数据时, 如果所插入的数据与约束或规则的要求冲突, 或是它们的数据类型不兼容
时,将导致INSERT 语句执行失败。当使用SELECT或EXECUTE子句向表中一次插入多行数据时,如果其中
有任一行数据有误,它将导致整个插入操作失败,使SQL Server停止所有数据行的插入操作。
例一、使用数值列表方式( 假定 usertable 表中只定义了name、age和sex字段,且name、sex均为
char类型,age为int类型)。
INSERT usertable
VALUES ('张三','女',18)
例二、使用列名列表方式
INSERT usertable (age,name)
VALUES (18,'张三')
例三、在数值列表中,还可以将变量的值插入到表中。在使用变量为列提供数据时,应保证变量的
数据类型与列数据类型相同,或是可以自动将它们转换为相同的数据类型。例如:
DECLARE @name char(16)
SET @name='张三'
INSERT usertable
VALUES (@name,DEFAULT,20)
本例中Asp中是这样的:
dim name
name="张三"
sqlstr="INSERT usertable VALUES ('"&name&"','女',20)"
……
例四、将SELECT子句的所返回的结果集合插入到表中。例如:
INSERT usertable (name,sex,age)
SELECT 's'+name,sex,age
FROM usertable
WHERE name like '张%%'
二、修改数据
Transact-SQL中的UPDATE语句用于修改表中数据,该语句的语法格式为:
UPDATE ()
SET (
column_name={expression | DEFAULT }
| @variable = expression
} [,…n]
[FROM
{
| (select_statement) [AS] table_alias [,…m]) ]
}
[,…n]
]
[WHERE
| CURRENT OF ({[GLOBAL] cursor_name } | cursor_variable_name} }
]
别看写了一大堆,最常用的只是下列格式:
UPDATE table_name
SET column_name1=variable1,column_name2=variable2
WHERE search_conditions
其中table_or_view参数指出待修改的表或视图名称,其格式与INSERT语句中该参数的格式相同。
SET子句指出表中被修改的列或变量,以及它们的新值。column_name为被修改的列名,@variable
为一个已经声明的局部变量名称,它们修改后的值由expression表达式提供,或使用DEFAULT关键字将
默认值赋给指定列。
FROM子句引出另一个表,它为UPDATE语句的数据修改操作提供条件。
WHERE子句中的search_conditions 参数说明UPDATE语句的修改条件,它指出表或视图中的哪些行
需要修改。省略WHERE子句时,说明对指定的表或视图中的所有行进行修改!!!!
WHERE子句中的CURRENT OF说明在游标的当前位置处执行修改操作,游标由curror_name 或游标变
量cursor_variable_name指定。
UPDATE不能修改具有IDENTITY属性列的列值。
例一、将usertable表中所有人员的性别改为'男'
UPDATE usertable
SET sex='男'
例二、将性别为null的所有人员的性别改成'男'
UPDATE usertable
SET sex='男'
WHERE sex IS NULL
例三、将所有姓名为null的人员的姓名改为'张三'、性别改为'女',年龄改为18
UPDATE usertable
SET name='张三',sex='女',age=18
WHERE name IS NULL
三、删除数据
Transact-SQL中,DELETE和TRUNCATE TABLE语句均可以删除表中的数据。DELETE语句的语法格式为:
DELETE
{table_name | view_name}
FROM
{
| (select_statement) [AS] table_alias [(column_alias [,…m])]
}[,…n]
[WHERE
{
|{ [CURRENT OF {{[global] cursor_name}
|cursor_variable_name
}
DELETE语句的结构与UPDATE语句有些类似,其中也包含FROM子句和WHERE子句。WHERE子句为数据删
除指定条件。不使用WHERE子句时,DELETE语句将把有或视图中所有的数据删除。FROM子句是Transact-
SQL在ANSI基础上对DELETE语句的扩展,它指定要连接的表名,提供与相关子查询相似的功能。
TRUNCATE TABLE语句语法格式为:
TRUNCATE TABLE table_name
TRUNCATE TABLE语句删除指定表中的所有数据行,但表结构及其所有索引继续保留,为该表所定义
约束、规则、默认和触发器仍然有效。如果所删除表中包含有IDENTITY列,则该列将被复位到其原始基
值。使用不带WHERE子句的DELETE语句也可以删除表中所有行,但它不复位IDENTITY列。
与DELETE语句相比,TRUNCATE TABLE语句的删除速度更快。因为DELETE语句在每删除一行时都要把
删除操作记录到日志中,而TRUNCATE TABLE语句则是通过释放表数据页面的方法来删除表中数据,它只
在释放页面做一次事务日志记录。所以使用TRUNCATE TABLE语句删除数据后,这些行是不可恢复的,而
DELETE操作则可回滚,能够恢复原来数据。
因为TRUNCATE TABLE语句不做操作日志,它不能激活触发器,所以TRUNCATE TABLE语句不能删除一
个被其它表通过FOREIGN KEY约束所参照的表。
例一、使用DELETE语句删除usertable表中name为'张三'的数据行
DELETE usertable
WHERE name='张三'
例二、下面使用FROM子句和WHERE子句指定条件,然后从TB_update表中删除数据
DELETE TB_update
FROM TB_constraint AS a,TB_update AS b
WHERE a.name=b.name
AND a.country='China'
DELETE TB_update
FROM (SELECT * FROM TB_constraint
WHERE country='USA') AS a
WHERE a.name=TB_update.name
触发器
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)
我为什么要使用触发器?比如,这么两个表:
Create Table Student( --学生表
StudentID int primary key, --学号
....
)
Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte Datetime, --归还时间
. )
用到的功能有:
1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。对于1,创建一个Update触发器:
Create Trigger truStudent
On Student
for Update
As
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i
Where br.StudentID=d.StudentID
end
理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。
对于2,创建一个Delete触发器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。