鄒建sql
1. 鄒建的作者簡介
中國著名企業家鄒建,江西景德鎮人士,閑逛網創始人。
鄒建,熟悉資料庫技術,對MS sql Server資料庫體系結構、備份恢復、設計、管理、性能優化等都有深入研究,項目經驗豐富,擅長資料庫優化及故障診斷,現任職於某電子商務公司,資深DBA,負責資料庫管理與維護工作。
2. 初學者學習SQL用那本書比較好
《深入淺出——SQL Server 2000開發、管理與應用實例》
作者:鄒健
編著出版社:人民郵電出版社
出版時間:2008年08月
定價:59元
本書從應用、開發和管理3個角度逐步深入,全面介紹SQL Server 2000資料庫技術,不但整合了資深專家數年工作實踐和寶貴經驗,還根據DBA所需具備的從業素質規劃了內容結構。
本書全面系統地介紹了SQL Server開發和管理的應用技術,涉及安裝和配置SQL Server、日期處理、字元處理、排序規則、編號處理、數據統計與匯總、分頁處理、樹形數據處理、數據導入與導出、作業、數據備份與還原、用戶定義數據類型、資料庫安全、系統表應用實例、索引、事務及鎖、SQL Server應用疑難解答等內容。
本書不但融合了作者在使用SQL Server 2000過程中遇到的各種常見問題和應用案例,還總結了作者幾年來在CSDN社區SQL Server版所解決的大量問題,面向實際項目需求,涉及不同類型的應用,能夠多角度地引導讀者學習相關知識。針對各類問題,書中提供了詳細的操作步驟和解決思路,具有很強的實用性和可操作性。
本書適用於已經掌握了SQL Server基礎知識,但缺少實踐經驗的讀者,對初學者來說更是一本入門與進階的必備指導用書。
鄒建,網名ZJCXC,CSDN社區MS SQL Server版大版主,微軟2004—2007 SQL Server MVP(微軟最有價值專家)。著有《中文版SQL Server 2000開發與管理應用實例》一書,該書深受讀者好評。熟悉資料庫技術,對MS SQL Server資料庫體系結構、備份恢復、設計、管理、性能優化等都有深
3. 在SQL資料庫中附加資料庫時遇到如下錯誤,請問如何解決執行 Transact-SQL 語句或批處理時發生了異常
轉csdn
sql專家鄒建的解決辦法
作者:鄒建
直接restore或附加應該是不行的,
用腳本+導數據肯定沒有問題。
2005轉到2000的步驟步驟
1.
生成for
2000版本的資料庫腳本
2005
的manger
studio
--
打開"對象資源管理器"(沒有的話按F8),
連接到你的實例
--
右鍵要轉到2000的庫
--
任務
--
生成腳本
--
在"腳本向導"的"選擇資料庫"中,
確定選擇的是要轉到2000的庫
--
勾選"為所選資料庫中的所有對象編寫腳本"
--
在接下來的"選擇腳本選項"中,
找到"為伺服器版本編寫腳本"項,
選擇"SQL
Server
2000"
--
其他選項根據需要設置
--
最後把腳本保存到一個
.sql
腳本文件
2.
在2000中創建目標資料庫
在查詢分析器(或2005的manger
studio在打開腳本文件),
連接到SQL
Server
2000,執行上面生成的腳本.以創建一個新的資料庫
3.
將數據從2005導到2000
2005
的manger
studio
--
打開"對象資源管理器"(沒有的話按F8),
連接到你的實例
--
右鍵要轉到2000的庫
--
任務
--
導出數據
--
在"SQL
Server
導入和導出向導"的"選擇數據源"步驟中,
確定選擇的是要導出的資料庫
--
在"選擇目標"步驟中,
連接到
2000,
並選擇步驟2新建的庫
--
在"選擇源表和源視圖"中,
選擇所有的表
--
最後完成
4. 鄒建的介紹
鄒建,CSDN社區MS SQL Server版大版主,微軟2004-2007 SQL Server MVP(微軟最有價值專家)。著有《中文版SQL Server 2000開發與管理應用實例》一書,該書深受讀者好評。
5. SQL比較兩張表的異同
*--比較兩個資料庫的表結構差異
--鄒建 2003.9(引用請保留此信息)--*/
/*--調用示例
exec p_comparestructure 'xzkh_model','xzkh_new'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_comparestructure]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_comparestructure]
GO
create proc p_comparestructure
@dbname1 varchar(250), --要比較的資料庫名1
@dbname2 varchar(250) --要比較的資料庫名2
as
create table #tb1(表名1 varchar(250),欄位名 varchar(250),序號 int,標識 bit,主鍵 bit,類型 varchar(250),
佔用位元組數 int,長度 int,小數位數 int,允許空 bit,默認值 varchar(500),欄位說明 varchar(500))
create table #tb2(表名2 varchar(250),欄位名 varchar(250),序號 int,標識 bit,主鍵 bit,類型 varchar(250),
佔用位元組數 int,長度 int,小數位數 int,允許空 bit,默認值 varchar(500),欄位說明 varchar(500))
--得到資料庫1的結構
exec('insert into #tb1 SELECT
表名=d.name,欄位名=a.name,序號=a.colid,
標識=case when a.status=0x80 then 1 else 0 end,
主鍵=case when exists(SELECT 1 FROM '+@dbname1+'..sysobjects where xtype=''PK'' and name in (
SELECT name FROM '+@dbname1+'..sysindexes WHERE indid in(
SELECT indid FROM '+@dbname1+'..sysindexkeys WHERE id = a.id AND colid=a.colid
))) then 1 else 0 end,
類型=b.name, 佔用位元組數=a.length,長度=a.prec,小數位數=a.scale, 允許空=a.isnullable,
默認值=isnull(e.text,''''''),欄位說明=isnull(g.[value],'''''')
FROM '+@dbname1+'..syscolumns a
left join '+@dbname1+'..systypes b on a.xtype=b.xusertype
inner join '+@dbname1+'..sysobjects d on a.id=d.id and d.xtype=''U'' and d.name<>''dtproperties''
left join '+@dbname1+'..syscomments e on a.cdefault=e.id
left join '+@dbname1+'..sysproperties g on a.id=g.id and a.colid=g.smallid
order by a.id,a.colorder')
--得到資料庫2的結構
exec('insert into #tb2 SELECT
表名=d.name,欄位名=a.name,序號=a.colid,
標識=case when a.status=0x80 then 1 else 0 end,
主鍵=case when exists(SELECT 1 FROM '+@dbname2+'..sysobjects where xtype=''PK'' and name in (
SELECT name FROM '+@dbname2+'..sysindexes WHERE indid in(
SELECT indid FROM '+@dbname2+'..sysindexkeys WHERE id = a.id AND colid=a.colid
))) then 1 else 0 end,
類型=b.name, 佔用位元組數=a.length,長度=a.prec,小數位數=a.scale, 允許空=a.isnullable,
默認值=isnull(e.text,''''''),欄位說明=isnull(g.[value],'''''')
FROM '+@dbname2+'..syscolumns a
left join '+@dbname2+'..systypes b on a.xtype=b.xusertype
inner join '+@dbname2+'..sysobjects d on a.id=d.id and d.xtype=''U'' and d.name<>''dtproperties''
left join '+@dbname2+'..syscomments e on a.cdefault=e.id
left join '+@dbname2+'..sysproperties g on a.id=g.id and a.colid=g.smallid
order by a.id,a.colorder')
--and not exists(select 1 from #tb2 where 表名2=a.表名1)
select 比較結果=case when a.表名1 is null and b.序號=1 then '庫1缺少表:'+b.表名2
when b.表名2 is null and a.序號=1 then '庫2缺少表:'+a.表名1
when a.欄位名 is null and exists(select 1 from #tb1 where 表名1=b.表名2) then '庫1 ['+b.表名2+'] 缺少欄位:'+b.欄位名
when b.欄位名 is null and exists(select 1 from #tb2 where 表名2=a.表名1) then '庫2 ['+a.表名1+'] 缺少欄位:'+a.欄位名
when a.標識<>b.標識 then '標識不同'
when a.主鍵<>b.主鍵 then '主鍵設置不同'
when a.類型<>b.類型 then '欄位類型不同'
when a.佔用位元組數<>b.佔用位元組數 then '佔用位元組數'
when a.長度<>b.長度 then '長度不同'
when a.小數位數<>b.小數位數 then '小數位數不同'
when a.允許空<>b.允許空 then '是否允許空不同'
when a.默認值<>b.默認值 then '默認值不同'
when a.欄位說明<>b.欄位說明 then '欄位說明不同'
else '' end,
*
from #tb1 a
full join #tb2 b on a.表名1=b.表名2 and a.欄位名=b.欄位名
where a.表名1 is null or a.欄位名 is null or b.表名2 is null or b.欄位名 is null
or a.標識<>b.標識 or a.主鍵<>b.主鍵 or a.類型<>b.類型
or a.佔用位元組數<>b.佔用位元組數 or a.長度<>b.長度 or a.小數位數<>b.小數位數
or a.允許空<>b.允許空 or a.默認值<>b.默認值 or a.欄位說明<>b.欄位說明
order by isnull(a.表名1,b.表名2),isnull(a.序號,b.序號)--isnull(a.欄位名,b.欄位名)
go
6. 創建安全帳戶的sql語句有哪些
創建角色,用戶,許可權 /*--示例說明 示例在資料庫pubs中創建一個擁有表jobs的所有許可權、擁有表titles的SELECT許可權的角色r_test 隨後創建了一個登錄l_test,然後在資料庫pubs中為登錄l_test創建了用戶賬戶u_test 同時將用戶賬戶u_test添加到角色r_test中,使其通過許可權繼承獲取了與角色r_test一樣的許可權 最後使用DENY語句拒絕了用戶賬戶u_test對表titles的SELECT許可權。 經過這樣的處理,使用l_test登錄SQL Server實例後,它只具有表jobs的所有許可權。 --*/ USE pubs --創建角色 r_test EXEC sp_addrole 'r_test' --授予 r_test 對 jobs 表的所有許可權 GRANT ALL ON jobs TO r_test --授予角色 r_test 對 titles 表的 SELECT 許可權 GRANT SELECT ON titles TO r_test --添加登錄 l_test,設置密碼為pwd,默認資料庫為pubs EXEC sp_addlogin 'l_test','pwd','pubs' --為登錄 l_test 在資料庫 pubs 中添加安全賬戶 u_test EXEC sp_grantdbaccess 'l_test','u_test' --添加 u_test 為角色 r_test 的成員 EXEC sp_addrolemember 'r_test','u_test' --拒絕安全賬戶 u_test 對 titles 表的 SELECT 許可權 DENY SELECT ON titles TO u_test /*--完成上述步驟後,用 l_test 登錄,可以對jobs表進行所有操作,但無法對titles表查詢,雖然角色 r_test 有titles表的select許可權,但已經在安全賬戶中明確拒絕了對titles的select許可權,所以l_test無titles表的select許可權--*/ --從資料庫 pubs 中刪除安全賬戶 EXEC sp_revokedbaccess 'u_test' --刪除登錄 l_test EXEC sp_droplogin 'l_test' --刪除角色 r_test EXEC sp_droprole 'r_test' SQL code --1. 創建示例環境。首先使用下面的代碼創建一個登錄l_test,並且為登錄在資料庫pubs中創建關聯的用戶賬戶u_test,並且授予用戶賬戶u_test對表titles的SELECT許可權,用以實現登錄l_test連接到SQL Server實例後,可以訪問表titles。然後創建了一個應用程序角色r_p_test,授予該角色對表jobs的SELECT許可權,用以實現激活r_p_test時,允許訪問特定的表jobs。USE pubs--創建一個登錄 l_test, 密碼 pwd, 默認資料庫 pubsEXEC sp_addlogin 'l_test','pwd','pubs' --為登錄 l_test 在資料庫 pubs 中添加安全賬戶 u_testEXEC sp_grantdbaccess 'l_test','u_test'--授予安全賬戶 u_test 對 titles 表的 SELECT 許可權GRANT SELECT ON titles TO u_test--創建一個應用程序角色 r_p_test, 密碼 abcEXEC sp_addapprole 'r_p_test','abc'--授予角色 r_p_test 對 jobs 表的 SELECT 許可權GRANT SELECT ON jobs TO r_p_testGO--2. 激活應用程序角色。/*--激活說明 示例環境創建完成後,在任何地方(比如查詢分析器、應用程序) 使用登錄l_test連接SQL Server實例,均只能訪問表titles,或者是guest用戶 和public角色允許訪問的對象。 如果要在某些特定的應用程序中,允許登錄訪問表jobs,那麼, 可以激活應用程序角色r_p_test,激活應用程序角色後,登錄本身的許可權會消失。 下面在查詢分析器中登錄,演示激活應用程序角色r_p_test前後對數據訪問的區別。--*/--激活應用程序角色 r_p_test 前,登錄具有表 titles 的訪問權,但無表 jobs 的訪問權SELECT titles_count=COUNT(*) FROM titlesSELECT jobs_count=COUNT(*) FROM jobs/*--結果:titles_count ------------ 18(所影響的行數為 1 行)伺服器: 消息 229,級別 14,狀態 5,行 2拒絕了對對象 'jobs'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。--*/GO--用密碼 abc 激活 r_p_test 應用程序角色,並且在將此密碼發送到SQL Server之前對其加密EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'GO--激活應用程序角色 r_p_test 後,登錄失去表 titles 的訪問權,獲取表 jobs 的訪問權SELECT titles_count=COUNT(*) FROM titlesSELECT jobs_count=COUNT(*) FROM jobs/*--結果伺服器: 消息 229,級別 14,狀態 5,行 2拒絕了對對象 'titles'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。jobs_count ----------- 14(所影響的行數為 1 行)--*/ SQL code exec sp_dropsrvrolemember N'aa', sysadmingoexec sp_addsrvrolemember N'aa', securityadmingo--作好SQL的安全管理--作者:鄒建首先,做好用戶安全: --簡單的,只允許sql的用戶訪問sql(防止利用administrator組用戶訪問) 1.企業管理器--右鍵SQL實例--屬性--安全性--身份驗證--選擇"sql server和windows"--確定 2.企業管理器--安全性--登陸--右鍵sa--設置密碼--其他用戶也設置密碼 3.刪除用戶: BUILTIN\Administrators <機器名>\Administrator --這個用戶不一定有 這樣可以防止用windows身份登陸SQL 4.設置進入企業管理器需要輸入密碼 在企業管理器中 --右鍵你的伺服器實例(就是那個有綠色圖標的) --編輯SQL Server注冊屬性 --選擇"使用 SQL Server 身份驗證" --並勾選"總是提示輸入登錄名和密碼" --確定 --經過上面的設置,你的SQL Server基本上算是安全了. ------------------------------------------------------------------------ 其次,改默認埠,隱藏伺服器,減少被攻擊的可能性 SQL Server伺服器 --開始 --程序 --Microsoft SQL Server --伺服器網路實用工具 --啟用的協議中"TCP/IP" --屬性 --默認埠,輸入一個自已定義的埠,比如2433 --勾選隱藏伺服器 ---------------------------------------------------------------------------- --管好sql的用戶,防止訪問他不該訪問的資料庫(總控制,明細還可以控制他對於某個資料庫的具體對象具有的許可權) --切換到你新增的用戶要控制的資料庫 use 你的庫名 go --新增用戶 exec sp_addlogin 'test' --添加登錄 exec sp_grantdbaccess N'test' --使其成為當前資料庫的合法用戶 exec sp_addrolemember N'db_owner', N'test' --授予對自己資料庫的所有許可權 --這樣創建的用戶就只能訪問自己的資料庫,及資料庫中包含了guest用戶的公共表 go --刪除測試用戶 exec sp_revokedbaccess N'test' --移除對資料庫的訪問許可權 exec sp_droplogin N'test' --刪除登錄 如果在企業管理器中創建的話,就用:企業管理器--安全性--右鍵登錄--新建登錄常規項--名稱中輸入用戶名--身份驗證方式根據你的需要選擇(如果是使用windows身份驗證,則要先在操作系統的用戶中新建用戶)--默認設置中,選擇你新建的用戶要訪問的資料庫名伺服器角色項這個裡面不要選擇任何東西資料庫訪問項勾選你創建的用戶需要訪問的資料庫名資料庫角色中允許,勾選"public","db_ownew"確定,這樣建好的用戶與上面語句建立的用戶一樣 --------------------------------------------------------------------------- 最後一步,為具體的用戶設置具體的訪問許可權,這個可以參考下面的最簡示例: --添加只允許訪問指定表的用戶: exec sp_addlogin '用戶名','密碼','默認資料庫名' --添加到資料庫 exec sp_grantdbaccess '用戶名' --分配整表許可權 GRANT SELECT , INSERT , UPDATE , DELETE ON table1 TO [用戶名]--分配許可權到具體的列GRANT SELECT , UPDATE ON table1(id,AA) TO [用戶名] ------------------------------------------------------------------- 至於具體的安全設置和理論知道,參考SQL聯機幫助 SQL code /*--創建一個只允許特定程序使用的資料庫用戶 創建一個用戶,這個用戶只有用我們特定的應用程序登錄 才具有訪問資料庫的許可權,用其他工具登錄沒有任何許可權 在下面的示例中,演示了如何控制登錄l_test 使其登錄後只允許訪問pubs資料庫的titles表 而對jobs表的訪問許可權,只允許在某些許可的應用程序中訪問。--鄒建 2004.09(引用請保留此信息)--*/--創建測試環境USE pubs--創建一個登錄 l_test, 密碼 pwd, 默認資料庫 pubsEXEC sp_addlogin 'l_test','pwd','pubs' --為登錄 l_test 在資料庫 pubs 中添加安全帳戶 u_testEXEC sp_grantdbaccess 'l_test','u_test'--授予安全帳戶 u_test 對 titles 表的 SELECT 許可權GRANT SELECT ON titles TO u_test--創建一個應用程序角色 r_p_test, 密碼 abcEXEC sp_addapprole 'r_p_test','abc'--授予角色 r_p_test 對 jobs 表的 SELECT 許可權GRANT SELECT ON jobs TO r_p_testGO--創建好上面的測試後,現在來測試如何使用應用程序角色--我們把用戶及密碼告訴使用者,即告訴使用者,用戶是: l_test,密碼是: pwd--使用者可以用我們這個用戶在任何地方登錄,包含查詢分析器--但是,用戶只能訪問 titles 表,不能訪問其他對象,如果建立用戶時不授予它任何許可權,則它不訪問除guest用戶和public角色允許訪問外的任何對象--OK,到這里,我們是把用戶控制住了--下面我們再來說在程序中的處理,因為用戶在程序中登錄後,需要對jobs表有訪問許可權的--我們只需要在用戶登錄後,執行一句 EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'--這樣,我們登錄的用戶就轉變為 r_p_test 角色的許可權,而它自身的許可權丟失--只要這個用戶不退出應用程序,他的許可權就會保持--如果用戶退出了當前應用程序,則他的許可權自動收回--同時,這個用戶即使沒有退出應用程序,他也是只在我們的應用程序中有許可權,在其他地方登錄,也不會有許可權--因為這個密碼我們是不用給用戶的,所以,用戶沒有這個角色的密碼,也就限制了他只能在程序中使用我們的數據--激活應用程序角色 r_p_test 前,登錄具有表 titles 的訪問權,但無表 jobs 的訪問權SELECT titles_count=COUNT(*) FROM titlesSELECT jobs_count=COUNT(*) FROM jobs/*--結果:titles_count ------------ 18(所影響的行數為 1 行)伺服器: 消息 229,級別 14,狀態 5,行 2拒絕了對對象 'jobs'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。--*/GO--用密碼 abc 激活 r_p_test 應用程序角色,並且在將此密碼發送到SQL Server之前對其加密EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'GO--激活應用程序角色 r_p_test 後,登錄失去表 titles 的訪問權,獲取表 jobs 的訪問權SELECT titles_count=COUNT(*) FROM titlesSELECT jobs_count=COUNT(*) FROM jobs/*--結果伺服器: 消息 229,級別 14,狀態 5,行 2拒絕了對對象 'titles'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。jobs_count ----------- 14(所影響的行數為 1 行)--*/go--刪除測試EXEC sp_dropapprole 'r_p_test'EXEC sp_revokedbaccess 'u_test'EXEC sp_droplogin 'l_test'
7. SQL2005 附加 2008 資料庫出錯的問題
2005
不能附加經過2008附加過的資料庫(2008附加會有一個升級的過程,升級後不能降級)
也不能用備份+還原的方式解決問題
可以在2008中右鍵資料庫--任務--生成腳本
通過腳本生成向導為整個庫的對象生成腳本,並設置好相關的腳本生成選項,尤其要注意的是腳本的伺服器版本要選擇sql
server
2005
完成向導後,在2005中執行生成的腳本,這樣就把2008的庫結構搬到2005了
再用數據導入/導出向導把數據導過去就行了
轉自:鄒建
8. 學習SQL,看哪些資料比較好
《中文版SQL Server 2000開發與管理應用》 作者:鄒建
SQL Server 2005 Transact-SQL編程入門經典 :(美)特里(Turley,P.),(美)伍德(Wood,D.) 著,劉穎 譯
SQLServer 2005開發聖經 SQL Server2005系統管理實錄 SQLServer 2005資料庫開發詳解(姚巧枚 胡百敬)
自己 挑吧
建議你先看看ACCSEE,建幾個查詢,看查詢所對應的SQL視圖,有個對照,知道什麼語句有什麼效果。
這些對你學習sql都有很大的幫助,不妨看看
9. sql server中利用sql語句如何創建角色和用戶
, securityadmingo--作好SQL的安全管理--作者:鄒建 首先,做好用戶安全:--簡單的,只允許sql的用戶訪問sql(防止利用administrator組用戶訪問)1 .企業管理器--右鍵SQL實例--屬性--安全性--身份驗證--選擇"sql server和windows"--確定2 .企業管理器--安全性--登陸--右鍵sa--設置密碼--其他用戶也設置密碼3 .刪除用戶:BUILTIN\Administrators<機器名 \Administrator--這個用戶不一定有 這樣可以防止用windows身份登陸SQL4 .設置進入企業管理器需要輸入密碼 在企業管理器中--右鍵你的伺服器實例(就是那個有綠色圖標的)--編輯SQL Server注冊屬性--選擇"使用 SQL Server 身份驗證"--並勾選"總是提示輸入登錄名和密碼"--確定--經過上面的設置,你的SQL Server基本上算是安全了.------------------------------------------------------------------------ 其次,改默認埠,隱藏伺服器,減少被攻擊的可能性 SQL Server伺服器--開始--程序--Microsoft SQL Server--伺服器網路實用工具--啟用的協議中"TCP/IP"--屬性--默認埠,輸入一個自已定義的埠,比如2433--勾選隱藏伺服器------------------------------------------------------------------------------管好sql的用戶,防止訪問他不該訪問的資料庫(總控制,明細還可以控制他對於某個資料庫的具體對象具有的許可權)--切換到你新增的用戶要控制的資料庫use你的庫名go--新增用戶execsp_addlogin'test'--添加登錄execsp_grantdbaccess N'test'--使其成為當前資料庫的合法用戶execsp_addrolemember N'db_owner' , N'test'--授予對自己資料庫的所有許可權--這樣創建的用戶就只能訪問自己的資料庫,及資料庫中包含了guest用戶的公共表go--刪除測試用戶execsp_revokedbaccess N'test'--移除對資料庫的訪問許可權execsp_droplogin N'test'--刪除登錄 如果在企業管理器中創建的話,就用:企業管理器--安全性--右鍵登錄--新建登錄常規項--名稱中輸入用戶名--身份驗證方式根據你的需要選擇(如果是使用windows身份驗證,則要先在操作系統的用戶中新建用戶)--默認設置中,選擇你新建的用戶要訪問的資料庫名 伺服器角色項 這個裡面不要選擇任何東西 資料庫訪問項 勾選你創建的用戶需要訪問的資料庫名 資料庫角色中允許,勾選"public ","db_ownew" 確定,這樣建好的用戶與上面語句建立的用戶一樣--------------------------------------------------------------------------- 最後一步,為具體的用戶設置具體的訪問許可權,這個可以參考下面的最簡示例:--添加只允許訪問指定表的用戶:execsp_addlogin'用戶名','密碼','默認資料庫名'--添加到資料庫execsp_grantdbaccess'用戶名'--分配整表許可權GRANTSELECT, INSERT, UPDATE, DELETEONtable1TO[用戶名]--分配許可權到具體的列GRANTSELECT, 至於具體的安全設置和理論知道,參考SQL聯機幫助
10. sqlsever 2000 分頁語句
CREATE PROCEDURE P_Page
(
@pageNo INT=1,
@pageSize INT=10
)
AS
DECLARE @s NVARCHAR(2000)
SET @s='SELECT top '+RTRIM(@pageSize)+'* FROM enterprise WHERE ID not in(select top '+RTRIM((@pageNo-1)*@pageSize)+' from enterprise)'
EXEC (@s)
go
可用存儲過程,如以上ID為表唯一列時可調用
SQL2000可用鄒建寫法,最高效的寫法還是針對性的寫
樓主換SQL2005以上版本可用row_Number實現更簡單
/*--用存儲過程實現的分頁程序
顯示指定表、視圖、查詢結果的第X頁
對於表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法
如果視圖或查詢結果中有主鍵,不推薦此方法
--鄒建 2003.09(引用請保留此信息)--*/
/*--調用示例
exec p_show '地區資料'
exec p_show '地區資料',5,3,'地區編號,地區名稱,助記碼','地區編號'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_show]
GO
CREATE Proc p_show
@QueryStr nvarchar(4000), --表名、視圖名、查詢語句
@PageSize int=10, --每頁的大小(行數)
@PageCurrent int=1, --要顯示的頁
@FdShow nvarchar (4000)='', --要顯示的欄位列表,如果查詢結果有標識欄位,需要指定此值,且不包含標識欄位
@FdOrder nvarchar (1000)='' --排序欄位列表
as
declare @FdName nvarchar(250) --表中的主鍵或表、臨時表中的標識列名
,@Id1 varchar(20),@Id2 varchar(20) --開始和結束的記錄號
,@Obj_ID int --對象ID
--表中有復合主鍵的處理
declare @strfd nvarchar(2000) --復合主鍵列表
,@strjoin nvarchar(4000) --連接欄位
,@strwhere nvarchar(2000) --查詢條件
select @Obj_ID=object_id(@QueryStr)
,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end
--如果顯示第一頁,可以直接用top來完成
if @PageCurrent=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
return
end
--如果是表,則檢查表中是否有標識更或主鍵
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
if @@rowcount=0 --如果表中無標識列,則檢查表中是否有主鍵
begin
if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
goto lbusetemp --如果表中無主鍵,則用臨時表處理
select @FdName=name from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
if @@rowcount>1 --檢查表中的主鍵是否為復合主鍵
begin
select @strfd='',@strjoin='',@strwhere=''
select @strfd=@strfd+',['+name+']'
,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
,@strwhere=@strwhere+' and b.['+name+'] is null'
from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
select @strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
goto lbusepk
end
end
end
else
goto lbusetemp
/*--使用標識列或主鍵為單一欄位的處理方法--*/
lbuseidentity:
exec('select top '+@Id1+@FdShow+' from '+@QueryStr
+' where '+@FdName+' not in(select top '
+@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
+')'+@FdOrder
)
return
/*--表中有復合主鍵的處理方法--*/
lbusepk:
exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
(select top 100 percent * from '+@QueryStr+@FdOrder+') a
left join (select top '+@Id2+' '+@strfd+'
from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
where '+@strwhere+') a'
)
return
/*--用臨時表處理的方法--*/
lbusetemp:
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))
exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from'+@QueryStr+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)
GO