sql server中利用sql語句如何創建角色和用戶

sql server中利用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, 默認數據庫 pubs EXEC sp_addlogin 'l_test','pwd','pubs' --爲登錄 l_test 在數據庫 pubs 中添加安全賬戶 u_test EXEC sp_grantdbaccess 'l_test','u_test' --授予安全賬戶 u_test 對 titles 表的 SELECT 權限 GRANT SELECT ON titles TO u_test --創建一個應用程序角色 r_p_test, 密碼 abc EXEC sp_addapprole 'r_p_test','abc' --授予角色 r_p_test 對 jobs 表的 SELECT 權限 GRANT SELECT ON jobs TO r_p_test GO --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 titles SELECT 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 titles SELECT jobs_count=COUNT(*) FROM jobs /*--結果 服務器: 消息 229,級別 14,狀態 5,行 2 拒絕了對對象 'titles'(數據庫 'pubs',所有者 'dbo')的 SELECT 權限。 jobs_count ----------- 14 (所影響的行數爲 1 行) --*/
SQL code
exec sp_dropsrvrolemember N'aa', sysadmin go exec sp_addsrvrolemember N'aa', securityadmin go --作好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, 默認數據庫 pubs EXEC sp_addlogin 'l_test','pwd','pubs' --爲登錄 l_test 在數據庫 pubs 中添加安全帳戶 u_test EXEC sp_grantdbaccess 'l_test','u_test' --授予安全帳戶 u_test 對 titles 表的 SELECT 權限 GRANT SELECT ON titles TO u_test --創建一個應用程序角色 r_p_test, 密碼 abc EXEC sp_addapprole 'r_p_test','abc' --授予角色 r_p_test 對 jobs 表的 SELECT 權限 GRANT SELECT ON jobs TO r_p_test GO --創建好上面的測試後,現在來測試如何使用應用程序角色 --我們把用戶及密碼告訴使用者,即告訴使用者,用戶是: 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 titles SELECT 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 titles SELECT 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'
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章