在master數據庫中不允許普通用戶在其中創建數據庫對象,否則會使得master數據庫的事務日志很快變滿。如果事務日志用盡,就無法使用dump transaction命令釋放master數據庫中的空間。
(2)model數據庫
它是為創建用戶數據庫而提供的模板。每當創建新的數據庫時,SQL Server自動建立model數據庫的一份拷貝,並把它擴充到用戶所要求的大小,以此作為新用戶數據庫。
Model數據庫中包含每個用戶數據庫所要求的系統表。Model數據庫可以被修改以便定制新創建的。
(3)tempdb數據庫
它是個臨時數據庫,為服務器運行與處理提供一個共享的存儲區域,如group by和order by的中間結果就存放在這裡。Tempdb的空間為服務器中所有數據庫的所有用戶所共享。
每次重啟SQL Server,服務器的一個自動進程都拷貝model數據庫到tempdb數據庫,並清除tempdb中原來的內容。因此tempdb中的用戶表都是臨時的。臨時表分為兩類:可共享的和不可共享的。不可共享的臨時表在由create table中將符號#置於表名之前創立;可共享的臨時表通過create table中指定表名前綴tempdb..而創立。不可共享的臨時表SQL Server自動為其添加數字後綴名,且它只存在於當前會話中。
(4)sybsystemprocs數據庫master數據庫
它是專門用來保存系統命令(存儲過程)的數據庫,如sp_help、sp_configure、sp_helpdevice等。當任一數據庫用戶運行以sp_開頭的存儲過程時,SQL Server按照以下順序查找:當前數據庫、sybsystemprocs數據庫、master數據庫。
2.用戶數據庫
用戶數據庫是我們使用Sybase服務器的真正目的。要管理用戶數據,必須在Sybase中創建自己的數據庫,它是指用create database命令創建的數據庫。不能存取master數據庫的用戶是無權創建新的數據庫的。
數據庫中的主要內容——數據庫對象:
表、視圖、臨時表
索引、主鍵、外鍵
缺省值、規則
存儲過程、觸發器等
五、Sybase的安裝與配置
1.服務器端的安裝
安裝建立SQL Server以後,要建立放置數據庫、日志和索引的邏輯磁盤設備。數據庫、日志和索引的配置應注意以下原則;
a.不要把任何用戶對象安裝在master數據庫中。
b.日志應該保存在與數據庫分離的磁盤上。
c.可以通過跨越多個設備分配工作優化I/O性能。
2.客戶端的安裝
3.需要立即更改的內容
(1)更改sa的登錄口令;(2)命名服務器;(3)修改文件名(保證Sybase Central正常啟動);(4)更改缺省設備;(5)增加tempdb的空間。
4.創建用戶數據庫
以下通過一個建立數據庫的腳本說明建立數據庫的過程:
//創建數據庫設備,設備大小以頁(2K)為單位
disk init
name=”test_dbdev”,
physname=”c:\test\test_dbdev.dat”,
vdevno=10,
size=10240
go
disk init
name=”test_logdev”,
phyname=”c:\test\test_logdev.dat”,
vdevno=11,
size=5120
go
//創建數據庫TEST_DB,其大小
1.使用段的優點
a. 控制空間的使用:放在一個段上的數據庫對象不會在段外增長;
b. 提高性能:處於不同磁盤設備上的段可以並行地讀寫;
d.處理大表:利用段,可以將一個大表分段放在獨立的物理設備上,如將一個表的文本或圖象數據存儲另外的一個段上。
2.創建段
sp_addsegment 段名,數據庫名,設備名
說明:在指定設備上為某個數據庫創建一個段。
●擴展段的范圍
sp_exetendsegment 段名,數據庫名,設備名
說明:設備在數據庫中必須可用,否則需要擴展數據庫到新的設備上;指定的段、數據庫、設備必須存在。
●縮小段的范圍:
sp_dropsegment 段名,數據庫名,設備名
說明:帶第三個參數時,該命令並不刪除段,只是段的范圍縮小了。若某個段包含了別的段要獨占的設備,就需要縮小該段的范圍。
3.使用段
●兩個數據庫放在同一設備的不同段上,它們不會相互影響;
●當數據庫增加空間時,增加的空間會自動分配到它的每一個段上;
例如:alter database my_db
on data_dev=50
在data_dev設備上為my_db增加50M空間,這50M空間被自動分配到數據庫的每一個段中。注意:如果data_dev對於數據庫是新的,system和default段會自動擴展到該設備上。
可以使用alter database命令的log on選項分配附加的日志空間。
(1)在段中創建新對象
create table 表名(列名 數據類型)[on 段名]
create [clusterd|non clusterd]index 索引名 on 表名(列名)[on 段名]
注意:按照定義,聚集索引總是與表放在同一段上。
(2)在段上放置現有對象
sp_placeobject 段名,對象名
注意:該命令並不把對象從一個數據庫設備移動到另一設備上,它只影響未來的空間分配。
可以將某個大表的text字段或image字段放置到一個單獨的設備段上。
Sp_placeobject 段名,“表名.字段名”
(3)在段上創建聚集索引
按
……
log on 日志設備=Log_Size
[With Override]//在同一設備上創建數據庫和事務日志時使用該選項
[For Load] //禁止用戶訪問直到數據庫的裝入或恢復操作完成為止
舉例:
Create Database test_db
On data_dev=100,//單位:M
Index_dev=50
Log on log_dev=30
說明:
(1)將日志放在單獨的設備上,有利於數據庫性能的提高;
(2)圖示:
Data_dev Index_dev log_dev
(3)如果將數據庫和日志放在同一設備上,就不能實現增量備份;
(4)通常將System和Default段縮減范圍到一個設備上,如刪除設備Index_dev上的System段和Default段,創建新的段,用來存放專門的數據庫對象。
二、更改數據庫
1.改變數據庫屬主
通常用戶數據庫有系統管理員創建,它的默認屬主是dbo。系統過程sp_changeddbowner可改變數據庫的屬主關系,它必須由數據庫管理員在要改變屬主關系的數據庫中執行。語法如下:
sp_changeddbowner login_name[,True]
其中參數True用於將權限一半傳遞給新屬主。
2.擴展數據庫
(1)擴展數據庫空間
alter database 數據庫名
on 設備名=擴展空間 //單位:M
如果擴展的設備對於數據庫是新的,System和Default段會自動擴展到該設備上。
(2)擴展事務日志到新的設備上
sp_logdevice 數據庫名,設備名
舉例:將數據庫另外擴充5M,用於存儲日志
alter database my_db
on my_dev=5
go
sp_logdevice my_db,my_dev
go
3.刪除數據庫
drop database 數據庫名
刪除設備前必須刪除其上的所有數據庫,刪除設備的命令是:sp_dropdevice
三、事務日志
日志文件是用來記錄數據庫每一次修改活動的文件。SQL Server中的每一個數據庫都有自己的日志文件,即系統表syslogs,也稱為事務日志。事務日志是撤消事務和出現故障時恢復事務的依據。
在某些情況下,事務日志比數據本身更為重要。
什麼是事務?
數據庫的修改是以事務為單位進行的。一個事務就是一個操作序列,這些操作要麼全做,要麼全不做,它是一個不可分割的工作單位。任何一個事務具備如下特征。
(1)執行的原子性(Atomic);
(2)保持數據的一致性(Consistency);
(3)彼此的隔離性(Isolation);
(4)作用的持久性(Durability)。
上述事務的四個特征被稱為事務的ACID准則。
事務在運行過程中,SQL Server把事務開始、事務結束以及對數據庫的插入、刪除和更新等每一個操作作為一個日志記錄存放到事務日志中。事務中的更新操作首先在數據庫緩沖區(內存)中進行,緩沖區分別有用來記錄操作活動的數據頁(data page)和日志頁(log page)。當運行到commit tran時,日志頁首先從緩沖區寫到磁盤上,而後數據頁從緩沖區寫到磁盤上,即遵循“先與日志(write_ahead log)”的原則,這樣保證出現故障的情況下,通過日志能夠得到最大限度的恢復。恢復必須撤消發生故障時還未提交的事務,已完成的事務若仍有未從緩沖區寫到數據庫設備中,還要重新運行該事務。
附:創建與裝載數據庫實例
use master
decl are @vedvno int
select @vdevno=max(convert(tinyint,substring(convert(binary(4),d.low),v.low,1
您正在看的sybase教程是:Sybase基礎知識。nbsp; size=153600
disk init
name=”YDINDEX”,
physname=”D: yb_Data\YDINDEX.dat”,
vdevno=@vdevno+2,
size=102400
disk init
name=”YDLOG”,
physname=”D: yb_Data\YDLOG.dat”,
vdevno=@vdevno+3,
size=76800
create database YDMISDB
on YDDATA=300,YDINDEX=200
log on YDLOG=150
use YDMISDB
execute sp_addsegment indexdev,YTMISDB,YTINDEX
execute sp_dropsegment “default”,YTMISDB,YTINDEX
execute sp_dropsegment system,YTMISDB,YTINDEX
use master
load database YDMISDB from ‘d:\yd_dump\ydmis_backup.dmp’
online database YDMISDB
第四講 數據庫安全性與用戶管理
一、安全管理概述
數據庫的安全性是指保護數據庫以防止不合法的使用所造成的數據洩露、更改或破壞。SQL Server的安全管理是一種基於角色(role)的管理方法,位於不同權限層次(或角色)的用戶具有不同的用戶權限。
規定用戶權限有三個因素:用戶、數據對象和操作,即什麼用戶在哪些數據對象上可以執行什麼操作。
訪問SQL Server中數據的四道屏障:
(1)操作系統——操作系統登錄
(2)Sybase服務器——服務器登錄
(3)Sybase數據庫——數據庫用戶登錄
(4)數據庫對象——對象授權
二、理解數據庫角色
角色是權限的集合。
1.系統預定義角色
一個真正的數據庫管理員應該是整個服務器及其數據庫的擁有者,具有管理服務器及其數據庫的所有權限。在一個大的系統中,數據庫管理員往往不只由一人承擔,而是將管理任務進行功能劃分,每人提當不同的責任。系統預定義角色就是為適應這種要求而設計的。
●系統管理員(sa_role)
sa_role角色擁有執行與數據庫具體應用無關的管理權限:
◇安裝與更新SQL Server
◇管理服務器的物理存儲
◇配置系統設置參數;
◇創建用戶數據庫;
◇授予SQL Server用戶權限
◇┅┅
●系統安全管理員(sso_role)
sso_role用來實施安全上敏感的操作,執行有關安全性的任務:
◇建立服務器登錄帳戶;
◇管理口令;
◇授予除sa_role之外的任何角色;
◇管理審計系統;
◇┅┅
●操作員(oper_role)
oper_role執行全服務器范圍的數據庫操作,如備份與恢復任意數據庫等:
◇轉儲數據庫與日志
◇轉載數據庫與日志
◇┅┅
2.創建與使用自定義角色
(1)創建新的角色:create role
(2)賦予角色權限:grant
(3)設置登錄帳戶的角色權限:sp_role
格式:sp_role “grant”|”revoke”,角色名,登錄帳號名
這裡的“grant”|”revoke”是指對角色權限是授予還是撤消。
三、服務器的帳戶管理
要想成為Sybase系統的一個用戶,首先必須擁有自己的登錄帳戶。通過這一帳戶連同自己的口令向服務器注冊後,才能使用Sybase系統中的一些資源,每一個這樣的登錄帳戶在系統中被賦予Server級的標識SUID。
1.添加登錄
sp_addlogin 登錄名,口令[,缺省的數據庫]
如果不指定缺省的數據庫,則該帳戶的缺省數據庫為master庫。
2.更改登錄屬性
◇更改口令;
◇鎖定帳戶;
◇期限設置;
◇賦予角色。Sybase
四、數據庫用戶管理
通過某一個帳戶注冊到服務器後,要想使用某一個數據庫,必須成為該數據庫的一個用戶。通過建立登錄與用戶之間的聯系來管理對數據庫的訪問。
to 轉儲設備名/物理文件名
[with No_truncate]
Truncate_only與no_log選項用於刪除事務處理而不作拷貝。Truncate_only截斷日志;在事務處理日志完全滿時用no_log,它不為數據庫建立檢查點。兩個選項都會丟掉日志。當使用了這兩個參數後,應及時備份整個數據庫。
No_truncate拷貝日志但不截斷日志,在出現介質錯誤時使用該選項。
圖形界面的選項與命令參數的對應關系:
(1)dump transaction (2)dump transaction…… with no_truncate
(3)dump transaction…… with truncate_only
(4)dump transaction……
r.proc_name
當執行語句在批處理的句首時,EXEC可以省略。
三、Sybase的數據類型
在創建表或聲明局部變量時,必須使用Sybase系統預定義類型。
1.字符類型
Char(n) VarChar(n)
2.數值類型
整數類型——Integer SmallInt TinyInt
浮點類型——Real Float Number[P,S] Decimal[P,S]
貨幣類型——Money SmallMoney
3.日期/時間類型
Datetime SmallDatetime
兩者時間部分的精度不同,前者精確到分,後者精確到1/30秒。
4.文本和圖像類型
Text Image
5.二進制數據類型
Binary(n) VarBinary(n)
四、數據定義語言
用來定義數據庫對象。數據庫對象是Sybase用來存儲數據的邏輯實體,主要有:
表(Table)、視圖(VIEw)、臨時表(Temp Table);
主鍵(Primary Key)、外鍵(Foreign Key)、索引(Index)、規則(Rule)、默認值(Default);
存儲過程(Stored Procedure)、觸發器(Trigger)
●基本語法
下面給出創建主要數據庫對象的語法:
1.表
創建表的基本語法是:
Create table[database.[owner
也即將簇聚索引和基表物理上分開。 這是不允許的,我們將在後面討論設備、數據庫、段、表分區時作詳細討論。
3.鍵(key)
理解鍵是理解關聯的關鍵。
鍵和索引往往是一回事。鍵的意義在概念上,鍵用於參照完整性約束。
主鍵是表的單值列的集合,主鍵通過在放置它們的表上創建一個單值索引來實現其單值性的。實際上主鍵是作為標志表的標志符而存在的,一旦主鍵確定,則由該主鍵就確定了的表也就確定了。
外鍵是和其它表中的主鍵相關的列,主鍵和外鍵的關系確定了外鍵的值域,該值域即為相應主鍵的取值范圍。這樣就從理論上強制實現了表與表之間的參照完整性。
前面創建表的語法裡包含了創建鍵的成分。也可以通過其它途徑創建主鍵和外鍵。
◇Unique約束和Primary key約束的區別
Unique約束和Primary key約束用來保證同一表中指定的列上沒有重復值,這兩個約束都產生唯一索引確保數據一致性,默認情況下,Unique約束產生唯一的非聚集索引,Primary key約束產生唯一的聚集索引。Primary key約束比Unique約束嚴格:Primary key列不允許有空值,Unique列允許有空值。
4.視圖
視圖是查看多表中數據的方法,視圖從基表派生,它並非物理存在,而是邏輯表;視圖也系統提供管理表的一種安全機制。視圖使得用戶集中精力在感興趣的數據集上。
創建視圖的語法:
create view [[database.]owner.]vIEw_name
[(column_name[,column_name]…)]
as select [distinct] select_statement
[with check option]
有distinct關鍵字的視圖不能更新。當視圖涉及關聯時,定義視圖要小心,這時是對多表操作,完整性顯得很重要。
五、數據操縱語言
1.Select語句
基本語法:
SELECT[all|distinct]字段列表
[into表名]
[from表名]
[where條件表達式]
[group by [all]字段列表]
[having篩選表達式]
[order by 字段列表[asc|desc]]
[compute聚集函數列表[by字段列表]]
注意:Select語句中的子句必須按照上述順序使用。也就是說,若該語句包括一個group by子句和一個order by子句where,group by子句必須放在order by子句之前。
Having子句類似於where子句,不同之處有兩點:(1)Having子句必須結合group by子句使用;(2)where子句不能用聚集函數,而Having子句可以。
下面通過實例來對Select的通常用法加以介紹。
例1:選擇所有的列,語法為select * from table_list
如:select * from publishers
例2:選擇指定的列,語法為
select column_name[,column_name]…
from table_name
如:select pub_id,pub_name from publishers
例3:重命名查詢結果中的列,語法為
select column_heading= column_name
from table_name
如:select Publisher=pub_name,pub_id
from publishers
例4:select列表中的計算值,可以對select列表中的數值數據進行計算,下面列出了算術運算符。
符號運算
+加
-減
/除
*乘
%取模
如select title_id,total_sales,total_sales*2 from titles
例5:使用distinct消除重復的查詢結果
可選的關鍵詞消除select語句的結果中的重復行。若不指定distinct,缺省值為all,將檢索出包含重復行的所有行數據。
如:select distinct au_id from titleauthor
例6:選擇行——where語句
select語句中的確切指定要檢索哪些行的准則,其一般格式為:
select select_list from table_list where search_conditions
where子句中的搜索條件(或稱限制)包括:
·比較運算符(=,<,>,!=等=
如:where advance*2>total_sales*price
·范圍(between和not between)
如:where total_sales between 5000 and 1
您正在看的sybase教程是:Sybase基礎知識。21;IN”,”MD”)
·匹配字符(like和not like)
如:where phone like “0535%”
·未知值(is null和is not null)
如:where advance is null
·以上各項的組合(and, or)
如:where advance<5000 or total_sales between 500 and 1000
例7:用集合函數小結查詢結果
集合函數用特定列的數據來計算小結值。
集合函數結 果
Sum([all|distinct]expression)數值列中(不重復)值的總和
Avg([all|distinct]expression)數值列中(不重復)值的平均
count([all|distinct]expression)列中(不重復)非空值的數目
Count(*)選定的行數
Max(expression)Expression的最大值
Min(expression)Expression的最小值
如:select avg(advance),sum(total_sales)
from titles
where type=”as”
select count(*) from titles
select avg(distinct price) from titles
select max(price) from books
例8:分組組織查詢結果——group by 子句
group by 子句用在select語句中將一張表分成若干組。
如:select type, advance from titles group by type
例9:選擇分組數據——having子句
having為group by 子句設置條件,與where為select語句設置條件一樣。Having搜索條件與where相同,但having可包括集合函數,而where不能包括。
下列語句使用帶集合函數having子句的例子。它把title表中的行按類型分組,但去掉了那只包含一本書的分組。
Select type from titles group by type having count(*)>1
下面是一個不帶集合函數的having子句的例子。它把title表中的行按類型分組,但去掉了那些不以字母“p”開頭的類型。
Select type from titles group by type having type like “p%”
例10:查詢結果排序——order by子句
Order by子句允許按一列或多列對查詢結果排序。每個排序可以是升序的(asc)或降序的(desc)。若不特別指明,則按升序進行。下列查詢返回按pub_id排序的結果:
Select pub_id,type,title_id from titles order by pub_id
例11:連接——從多張表中檢索數據
連接兩張或兩張以上的表是這樣一個過程:比較指定字段中的數據,根據比較結果用符合條件的行組成一張新表。
舉例:
select publishers.pub_id,publishers.pub_name,authors.*
from publishers,authors
where publishers.city=authors.city
例12:分組計算子句
Compute是Sybase對SQL標准中Group子句的擴充,可以將其看作帶聚集計算的Group子句。例如:
Select type,price,advance
From titles
Order by type
Compute sum(price),sum(advance) by type
2.Insert語句
用Insert命令向數據庫中添加行有兩種方法:使用關鍵詞values或使用select語句。
Insert語句的基本語法為:
Insert[into]表名[(字段列表)]
{values(值列表)|select_statement}
舉例:insert into publishers
values(‘1622’,’Jardin,Inc.’,’Camden’,
您正在看的sybase教程是:Sybase基礎知識。式)
rtrim(字符表達式)
……
3.數學函數
abs(精確小數型表達式)
floor(精確小數型表達式)求小於或等於給定表達式值的最大整數(取底)
rand([整數型]
round(精確小數型表達式,整數)
sign(精確小數型表達式)
power(精確小數型表達式,整數冪)
……
4.日期函數
getdate()
datepart(日期部分,日期)
datediff(日期部分,日期1,日期2)
dateadd(日期部分,數值表達式,日期)
5.類型轉換函數
convert(數據類型,表達式[,格式])
6.系統函數
db_name([數據庫ID])
host_name()
isnull(表達式1,表達式2)
……
七、數據控制語言
用來控制數據的安全性,如權限控制語句GRANT和REVOKE等。
第七講 數據庫編程基礎
一、批處理
SQL Server可以處理作為一批而提交的多個SQL語句,既可以是交互式的,也可以是一個文件。批處理SQL語句由批結束標志終止,該標志指示SQL Server從前面開始執行該批處理語句,對於獨立的SQL實用程序isql而言,其批結束標志為單獨占一行的“go”。
舉例:選擇表title及表authors的行數
select count(*) from titles
select count(*) from authors
go
二、流程控制語言
1.變量聲明與賦值
全局變量由系統預定義,以符號@@打頭。局部變量聲明使用Declare語句,這個變量必須以符號@開頭,後跟一個標識符。
Declare @變量名 數據類型[,@變量名 數據類型,……]
變量賦值使用Select語句,未賦值的變量其值為Null。
舉例:
Declare @msg char(50)
Select @msg=’How are you?’
Select @msg=emp_name from employee
Where emp_id=12345678
2.SQL語句塊
Begin
Statement Block/*多個順序執行的SQL 語句*/
End
3.條件語句
If 條件表達式
語句(塊)
Else
語句(塊)
舉例:
if(select max(id) from sysobjects)<50
print ‘數據庫裡沒有用戶創建的對象‘
else
select name,type,id from sysobjects where id>50
4.循環語句
While 條件表達式
語句(塊)
●兩個特殊的循環控制語句:
Continue 執行下一次循環
Break 退出當前循環
舉例:
While(select avg(price) from titles)>$20
Begin
Update titles set price=price/2
If(select avg(price) from titles)<$40
Break
Else
Continue
End
5.其它控制語句
◇Return語句——無條件結束當前過程,並可返回給調用者的一個狀態值:Return[整數表達式]
◇Print語句
◇RaiseError語句
◇Waitfor語句
三、存儲過程
存儲過程是存儲在服務器端的一類數據庫對象,它實質上是一段用SQL語言編寫的程序,它在服務器端預先經過編譯,並確定出執行計劃,因此與同樣功能的批處理語句相比,它的執行速度較快。
基本語法:
Create Procedure[owner.]過程名
[@參數名 數據類型[=默認值][Output]]
[,@參數名 數據類型[=默認值][Output]]
[……]
AS
Begin
SQL語句(塊)
End
存儲過程是數據庫對象,和表、索引是一個級別的;是SQL語句和控制流語言的集合,存儲過程在首次運行時被編譯,並駐留在過程高速緩存的內存中,所以存儲過程的招待非常快。存儲過程可以帶參數,可以調用其他過程,返回狀態值,返回參數值,並且可以在遠程SQL Server執行。可以在遠程SQL Server執行對數據庫設計有特別重要的意義。SQL Server提供的存儲過程稱為系統過程。
存儲過程大大增強了SQL的能力、效率和靈活性,經過編譯的存儲過程極大地改善SQL語句和批處理的性能。
存儲過程有很多優點:
●存儲過程在第一次執行時編譯,並存儲在過程高速緩存的內存中。編譯時系統對其進行優化,以選擇最佳的路徑來訪問數據集中的數據,這種優化考慮了數據集的實際數據結構。因此存儲過程大大提高了系統的性能。
●存儲過程可以跨服務器運行。這一點是通過觸發器來實現的,當然,首先存儲過程要能登錄到該遠程服務器。
●應用程序也能執行存儲過程,從而實現服務器和客戶之間的協同作業。
●存儲過程減少了網絡的交通。這是因為存儲過程的文本存儲在數據庫裡,調用存儲過程時通過網絡的只是存儲過程的過程名。
●利用存儲過程可以提供一個附加的安全層。
如(該例子取自pubs2數據庫):
Create proc titleid_proc(@title_id varchar(80))
As
Begin
Select @title_id=lower(@title_id)+”%”
Select title,title_id,price
Form titles
Where lower(title_id) like @title_id
Return @@rowcount
End
注意例子中的黑體部分,這實際上是一條賦值語句。該存儲過程有返回值。
存儲過程可以變得非常復雜。我們認為,創建存儲過程還是要遵循“最簡單就是最好”的原則。建議在創建存儲過程時采用縮進風格,否則創建的存儲過程三天之後連自己都看不懂。
您正在看的sybase教程是:Sybase基礎知識。建的對象。
●存儲過程包含的最多參數為255個,對存儲過程裡的局部和全局變量沒有限制。
最後討論一下系統存儲過程。系統存儲過程以sp_開頭,當然用戶創建的存儲過程也可以以sp_開頭;系統過程保存在sybsystemprocs數據庫裡。系統過程的使用有權限,如果打入系統過程名但沒有出現預期的結果,要麼是命令名錯,要麼是使用者沒有該過程的權限。一般可通過系統管理員或數據庫所有者對系統過程的execute授權。
系統過程繁多,大致有幾類:
a. 用戶標志和授權。這一類的過程主要由於:增加、刪除或報告在SQL Server上的登錄,增加、刪除或報告某數據庫的用戶、分組或別名等。這類過程有sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser等。
b. 遠程過程的調用。這類過程用於:增加、刪除或報告能存取本SQL Server的遠程服務器;增加能從遠程服務器上存取本SQL Server的用戶名。這類過程有:sp_addremotelogin,sp_addserver,sp_dropserver等。
c. 數據定義和數據庫對象。這類存儲過程用於:連接和定義規則和缺省值,增加、刪除或報告主碼、外碼和公共碼;增加、刪除或報告用戶定義的數據類型。這類存儲過程有:sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。
d. 系統管理。這類存儲過程用於:增加、刪除或報告數據庫及轉儲設備;報告鎖;設置的數據庫選擇及用戶正進行的進程;修改及報告配置變量;監控SQL Server的活動。這類過程有:sp_addumpdevice,sp_dropdevice, sp_helpdevice等。
四、觸發器
觸發器是一種用來保障參照完整性的特殊的存儲過程,它維護不同表中數據間關系的有關規則。當對指定的表進行某種特定操作(如:Insert,Delete或Update)時,觸發器產生作用。觸發器可以調用存儲過程。
創建觸發器的語法:
Create Trigger[owner.]觸發器名
On [owner.]表名
For {insert,update,delete}
As
Begin
SQL語句(塊)
End
定義一個好的觸發器對簡化數據的管理,保證數據庫的安全都有重要的影響。觸發器是針對表一級的,這就意味著,只有表的所有者有權創建表的觸發器。
舉例:
插入一個新行,必須保證外鍵與主鍵相匹配,觸發器應該首先檢查被插入行與主鍵表的連接。
以下的觸發器對inserted表和titles表的title_id進行比較,這裡假設正在給外鍵輸入數據,沒有插入空值,若連接失敗,事務被回退。insert,update,delete
Create trigger forinsertrigl
On salesdetail
For insert
As
If(select count(*)
From title,inserted
Where titles.title_id=inserted.title_id)!=@@rowcount
Begin
Rollback transaction
Print “No,some title_id does not exist in titles.”
End
Else
Print “Added! All the title_id is exist in titles.”
在本例中,@@rowcount代表添加到salesdetail表的行數,這也是添加到inserted表中的行數。
您正在看的sybase教程是:Sybase基礎知識。#8230;…]
where current of 游標名
舉例:
update publishers
set city=”Pasadena”,state=”CA”
where current of pubs_crsr
(4)關閉游標
當結束一個游標結果集時,可用close關閉。