-- 查看性能記數器sql
SELECT * FROM sys.dm_os_performance_counters
-- 執行過的線程所遇到的全部等待(不是當前正在運行的線程, 爲自上次重置統計信息或啓動服務器以來累積的數據),可分析靠前的幾個等待較高的事件。
select * from sys.dm_os_wait_stats order by wait_time_ms desc
該動態視圖的細節,請查看幫助文檔.
-- 重置該動態視圖
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
GO
-- 正在等待某些資源的任務的等待隊列
select * from sys.dm_os_waiting_tasks order by wait_duration_ms desc
內存使用:
查看當前由 SQL Server 分配的內存對象(KB): select sum((page_size_in_bytes/1024)*max_pages_allocated_count) from sys.dm_os_memory_objects;
查看系統內存當前信息: select * from sys.dm_os_sys_memory (這個動態視圖只在sql 2008中才有)
select
cpu_count,
hyperthread_ratio,
scheduler_count,
physical_memory_in_bytes / 1024 / 1024 as physical_memory_mb,
virtual_memory_in_bytes / 1024 / 1024 as virtual_memory_mb,
bpool_committed * 8 / 1024 as bpool_committed_mb,
bpool_commit_target * 8 / 1024 as bpool_target_mb,
bpool_visible * 8 / 1024 as bpool_visible_mb
from sys.dm_os_sys_info
限制SQL Server使用的最小,最大內存(MB):
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'min server memory', 300;
GO
sp_configure 'max server memory', 850;
GO
RECONFIGURE;
GO
CPU使用狀況:
SELECT TOP 50
total_worker_time/execution_count AS '每次執行佔用CPU(微秒)',
execution_count as '執行次數',
total_worker_time as '總共佔用CPU(微秒)',
creation_time as '建立時間',
last_execution_time as '最後執行時間',
min_worker_time as '最低每次佔用CPU',
max_worker_time as '最高每次佔用cpu',
total_physical_reads as '總共io物理讀取次數',
total_logical_reads as '總共邏輯讀取次數',
total_logical_writes as '總共邏輯寫次數',
total_elapsed_time as '完成此計劃的執行所佔用的總時間(微秒)',
(SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS 'SQL內容'
FROM sys.dm_exec_query_stats
ORDER BY 1 DESC
--下面的查詢顯示SQL 等待分析和前10 個等待的資源
select top 10 *
from sys.dm_os_wait_stats
where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
order by wait_time_ms desc;
SQL Server中的活動會話數:
exec sp_who 'active'
print @@rowcount
SQL Server等待狀況
select * from sys.dm_os_waiting_tasks ; --當前等待事件
select * from sys.dm_os_wait_stats --歷史等待次數,是sqlserver啓動後的累計值,需使用下一條語句清空
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
找出進程阻塞:
運行下面的查詢可肯定阻塞的會話
select blocking_session_id, wait_duration_ms, session_id from
sys.dm_os_waiting_tasks
where blocking_session_id is not null
spid 正在阻塞另外一個 spid,可在數據庫中建立如下存儲過程,而後執行該存儲過程。此存儲過程會報告此阻塞狀況。鍵入 sp_who 可找出 @spid;@spid 是可選參數。
create proc dbo.sp_block (@spid bigint=NULL)
as
select
t1.resource_type,
'database'=db_name(resource_database_id),
'blk object' = t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.blocking_session_id
from
sys.dm_tran_locks as t1,
sys.dm_os_waiting_tasks as t2
where
t1.lock_owner_address = t2.resource_address and
t1.request_session_id = isnull(@spid,t1.request_session_id)
如下是使用此存儲過程的示例。
exec sp_block
exec sp_block @spid = 7
select sum((page_size_in_bytes/1024)*max_pages_allocated_count) from sys.dm_os_memory_objects;
select * from sys.dm_os_sys_info;
select * from sys.dm_os_performance_counters
A. 獲取有關按平均 CPU 時間排在最前面的五個查詢的信息
如下示例返回前五個查詢的 SQL 語句文本和平均 CPU 時間。
複製代碼
SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC;
B. 提供批處理執行統計信息
如下示例返回按批執行的 SQL 查詢的文本,並提供有關它們的統計信息。
複製代碼
SELECT s2.dbid,
s1.sql_handle,
(SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,
( (CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)
ELSE statement_end_offset END) - statement_start_offset) / 2+1)) AS sql_statement,
execution_count,
plan_generation_num,
last_execution_time,
total_worker_time,
last_worker_time,
min_worker_time,
max_worker_time,
total_physical_reads,
last_physical_reads,
min_physical_reads,
max_physical_reads,
total_logical_writes,
last_logical_writes,
min_logical_writes,
max_logical_writes
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
WHERE s2.objectid is null
ORDER BY s1.sql_handle, s1.statement_start_offset, s1.statement_end_offset;
-- 數據庫文件性能,文件io性能統計(必須重啓sql server服務,才能清零該計數器)
select DB_NAME(database_id) DB_NAME, file_id,io_stall_read_ms ,num_of_reads
,cast(io_stall_read_ms/(1.0+num_of_reads) as numeric(10,1)) as 'avg_read_stall_ms'
,io_stall_write_ms,num_of_writes
,cast(io_stall_write_ms/(1.0+num_of_writes) as numeric(10,1)) as 'avg_write_stall_ms'
,io_stall_read_ms + io_stall_write_ms as io_stalls
,num_of_reads + num_of_writes as total_io
,cast((io_stall_read_ms+io_stall_write_ms)/(1.0+num_of_reads + num_of_writes) as numeric(10,1)) as 'avg_io_stall_ms'
from sys.dm_io_virtual_file_stats(null,null)
order by avg_io_stall_ms desc;
數據庫名
文件ID
用戶等待文件中發出讀取所用的總時間(毫秒)
對文件發出的讀取次數
平均讀文件等待(毫秒)
用戶等待在該文件中完成寫入所用的總時間(毫秒)
在該文件中寫入的次數
平均寫文件等待毫秒
(讀+寫)等待毫秒
(讀+寫)次數
(讀+寫)平均等待毫秒
-- 數據庫文件性能,文件io性能統計(必須重啓sql server服務,才能清零該計數器),
-- 效果和"SQL Server 2005/2008 性能監控(待續)" 中 提到的一致。
SELECT DB_NAME(vfs.DbId) DatabaseName, mf.name,
mf.physical_name, vfs.BytesRead, vfs.BytesWritten,
vfs.IoStallMS, vfs.IoStallReadMS, vfs.IoStallWriteMS,
vfs.NumberReads, vfs.NumberWrites,
(Size*8)/1024 Size_MB
FROM ::fn_virtualfilestats(NULL,NULL) vfs
INNER JOIN sys.master_files mf ON mf.database_id = vfs.DbId
AND mf.FILE_ID = vfs.FileId
GO
-- 性能計數器動態視圖, 和使用windows性能計數器效果一致。
SELECT [counter_name], [cntr_value] FROM sys.dm_os_performance_counters
WHERE ([instance_name] = '' OR [instance_name] = '_Total') AND (
([object_name] LIKE ('%Plan Cache%') AND [counter_name] IN
('Cache Hit Ratio', 'Cache Hit Ratio Base')) OR
([object_name] LIKE ('%Buffer Manager%') AND [counter_name] IN
('Buffer Cache Hit Ratio', 'Buffer Cache Hit Ratio Base', 'Page reads/sec', 'Page writes/sec')) OR
([object_name] LIKE ('%General Statistics%') AND [counter_name] IN
('Active Temp Tables', 'User Connections')) OR
([object_name] LIKE ('%Databases%') AND [counter_name] IN
('Transactions/sec', 'Log Cache Hit Ratio', 'Log Cache Hit Ratio Base', 'Log Flushes/sec',
'Log Bytes Flushed/sec', 'Backup/Restore Throughput/sec')) OR
([object_name] LIKE ('%Access Methods%') AND [counter_name] IN
('Full Scans/sec', 'Range Scans/sec', 'Probe Scans/sec', 'Index Searches/sec', 'Page Splits/sec')) OR
([object_name] LIKE ('%Memory Manager%') AND [counter_name] IN
('Target Server Memory (KB)', 'Target Server Memory(KB)', 'Total Server Memory (KB)')) OR
([object_name] LIKE ('%SQL Statistics%') AND [counter_name] IN
('SQL Compilations/sec', 'SQL Re-Compilations/sec'))
)
-- 查看分區表money,各個分區的行數和邊界值.
select partition = $partition.分區函數名(userid)
,rows = count(*)
,minval = min(userid)
,maxval = max(userid)
from dbo.money with(nolock)
group by $partition.分區函數名(userid)
order by partition;
--查詢某個數據庫的鏈接數
select count(*) from Master.dbo.SysProcesses where dbid=db_id()
--前10名其餘等待類型
SELECT TOP 10 *
from sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC
SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%'
OR wait_type like 'LAZYWRITER_SLEEP%'
--CPU的壓力
SELECT scheduler_id, current_tasks_count, runnable_tasks_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
--表現最差的前10名使用查詢
SELECT TOP 10 ProcedureName = t.text,
ExecutionCount = s.execution_count,
AvgExecutionTime = isnull ( s.total_elapsed_time / s.execution_count, 0 ),
AvgWorkerTime = s.total_worker_time / s.execution_count,
TotalWorkerTime = s.total_worker_time,
MaxLogicalReads = s.max_logical_reads,
MaxPhysicalReads = s.max_physical_reads,
MaxLogicalWrites = s.max_logical_writes,
CreationDateTime = s.creation_time,
CallsPerSecond = isnull ( s.execution_count / datediff ( second , s.creation_time, getdate ()), 0 )
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t ORDER BY
s.max_physical_reads DESC
SELECT SUM(signal_wait_time_ms) AS total_signal_wait_time_ms總信號等待時間 ,
SUM(wait_time_ms - signal_wait_time_ms) AS resource_wait_time_ms資源的等待時間,
SUM(signal_wait_time_ms) * 1.0 / SUM (wait_time_ms) * 100 AS [signal_wait_percent信號等待%],
SUM(wait_time_ms - signal_wait_time_ms) * 1.0 / SUM (wait_time_ms) * 100 AS [resource_wait_percent資源等待%]
FROM sys.dm_os_wait_stats
--一個信號等待時間過多對資源的等待時間那麼你的CPU是目前的一個瓶頸。
--查看進程所執行的SQL語句
if (select COUNT(*) from master.dbo.sysprocesses) > 500
begin
select text,CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) from master.sys.sysprocesses a
end
select text,a.* from master.sys.sysprocesses a
CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle)
where a.spid = '51'
dbcc inputbuffer(53)
with tb
as
(
select blocking_session_id,
session_id,db_name(database_id) as dbname,text from master.sys.dm_exec_requests a
CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle)
),
tb1 as
(
select a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)',
total_scheduled_time,reads,writes,logical_reads
from tb a inner join master.sys.dm_exec_sessions b
on a.session_id=b.session_id
)
select a.*,connect_time,client_tcp_port,client_net_address from tb1 a inner join master.sys.dm_exec_connections b on a.session_id=b.session_id
--當前進程數
select * from master.dbo.sysprocesses
order by cpu desc
--查看當前活動的進程數
sp_who active
--查詢是否因爲鏈接沒有釋放引發CPU太高
select * from master.dbo.sysprocesses
where spid> 50
and waittype = 0x0000
and waittime = 0
and status = 'sleeping '
and last_batch < dateadd(minute, -10, getdate())
and login_time < dateadd(minute, -10, getdate())
--強行釋放空鏈接
select 'kill ' + rtrim(spid) from master.dbo.sysprocesses
where spid> 50
and waittype = 0x0000
and waittime = 0
and status = 'sleeping '
and last_batch < dateadd(minute, -60, getdate())
and login_time < dateadd(minute, -60, getdate())
--查看當前佔用 cpu 資源最高的會話和其中執行的語句(及時CPU)
select spid,cmd,cpu,physical_io,memusage,
(select top 1 [text] from ::fn_get_sql(sql_handle)) sql_text
from master.dbo.sysprocesses order by cpu desc,physical_io desc
--查看緩存中重用次數少,佔用內存大的查詢語句(當前緩存中未釋放的)--全局
SELECT TOP 100 usecounts, objtype, p.size_in_bytes,[sql].[text]
FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
ORDER BY usecounts,p.size_in_bytes desc
SELECT top 25 qt.text,qs.plan_generation_num,qs.execution_count,dbid,objectid
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) as qt
WHERE plan_generation_num >1
ORDER BY qs.plan_generation_num
--cpu使用前50的語句
SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time,
SUM(qs.execution_count) AS total_execution_count,
SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time,
COUNT(*) AS number_of_statements
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
GROUP BY qt.text
ORDER BY total_cpu_time DESC --統計總的CPU時間
--ORDER BY avg_cpu_time DESC --統計平均單次查詢CPU時間
-- 計算可運行狀態下的工做進程數量
SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id
FROM sys.dm_os_workers AS o
INNER JOIN sys.dm_os_schedulers AS s
ON o.scheduler_address=s.scheduler_address
AND s.scheduler_id<255
WHERE o.state='RUNNABLE'
GROUP BY s.scheduler_id
--表空間大小查詢
create table #tb(表名 sysname,記錄數 int,保留空間 varchar(100),使用空間 varchar(100),索引使用空間 varchar(100),未用空間 varchar(100))
insert into #tb exec sp_MSForEachTable 'EXEC sp_spaceused ''?'''
select * from #tb
go
SELECT
表名,
記錄數,
cast(ltrim(rtrim(replace(保留空間,'KB',''))) as int)/1024 保留空間MB,
cast(ltrim(rtrim(replace(使用空間,'KB',''))) as int)/1024 使用空間MB,
cast(ltrim(rtrim(replace(使用空間,'KB',''))) as int)/1024/1024.00 使用空間GB,
cast(ltrim(rtrim(replace(索引使用空間,'KB',''))) as int)/1024 索引使用空間MB,
cast(ltrim(rtrim(replace(未用空間,'KB',''))) as int)/1024 未用空間MB
FROM #tb
WHERE cast(ltrim(rtrim(replace(使用空間,'KB',''))) as int)/1024 > 0
--order by 記錄數 desc
ORDER BY 使用空間MB DESC
DROP TABLE #tb
--查詢是否因爲鏈接沒有釋放引發CPU太高
select * from master.dbo.sysprocesses
where spid> 50
and waittype = 0x0000
and waittime = 0
and status = 'sleeping '
and last_batch < dateadd(minute, -10, getdate())
and login_time < dateadd(minute, -10, getdate())
--強行釋放空鏈接
select 'kill ' + rtrim(spid) from master.dbo.sysprocesses
where spid> 50
and waittype = 0x0000
and waittime = 0
and status = 'sleeping '
and last_batch < dateadd(minute, -60, getdate())
and login_time < dateadd(minute, -60, getdate())
----查看當前佔用 cpu 資源最高的會話和其中執行的語句(及時CPU)
select spid,cmd,cpu,physical_io,memusage,
(select top 1 [text] from ::fn_get_sql(sql_handle)) sql_text
from master.dbo.sysprocesses order by cpu desc,physical_io desc
----查看緩存中重用次數少,佔用內存大的查詢語句(當前緩存中未釋放的)--全局
SELECT TOP 100 usecounts, objtype, p.size_in_bytes,[sql].[text]
FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
ORDER BY usecounts,p.size_in_bytes desc
SELECT top 25 qt.text,qs.plan_generation_num,qs.execution_count,dbid,objectid
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) as qt
WHERE plan_generation_num >1
ORDER BY qs.plan_generation_num
SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time,
SUM(qs.execution_count) AS total_execution_count,
SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time,
COUNT(*) AS number_of_statements
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
GROUP BY qt.text
ORDER BY total_cpu_time DESC --統計總的CPU時間
--ORDER BY avg_cpu_time DESC --統計平均單次查詢CPU時間
-- 計算可運行狀態下的工做進程數量
SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id
FROM sys.dm_os_workers AS o
INNER JOIN sys.dm_os_schedulers AS s
ON o.scheduler_address=s.scheduler_address
AND s.scheduler_id<255
WHERE o.state='RUNNABLE'
GROUP BY s.scheduler_id
SELECT creation_time N'語句編譯時間'
,last_execution_time N'上次執行時間'
,total_physical_reads N'物理讀取總次數'
,total_logical_reads/execution_count N'每次邏輯讀次數'
,total_logical_reads N'邏輯讀取總次數'
,total_logical_writes N'邏輯寫入總次數'
, execution_count N'執行次數'
, total_worker_time/1000 N'所用的CPU總時間ms'
, total_elapsed_time/1000 N'總花費時間ms'
, (total_elapsed_time / execution_count)/1000 N'平均時間ms'
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) N'執行語句'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) not like '%fetch%'
ORDER BY total_elapsed_time / execution_count DESC
-- 查看當前db的登錄
select * from sys.sql_logins
-- 審覈登錄數據庫的用戶
sql server managerment studio中,右鍵點開服務器的屬性,在安全性頁籤中, 選中審覈「成功和失敗的登錄」,全部登錄都會在..MSSQL/Log/ERRORLOG中記錄一條記錄。
若是勾選「啓用C2審覈跟蹤」,將會在..MSSQL/Log/目錄中,不斷的增長audittrace201000502112519_15.trc文件,記錄每個對語句和對象的全部訪問的審覈. 可以使用SQL Server Profiler打開查看。(需手動刪除該類文件,不然磁盤必滿。)
-- SQL Server Profiler
sys.traces
--------------------------------------------------------------------------------
僅編寫存儲過程不足以保證應用程序的安全,還應當考慮如下潛在的安全漏洞。
1.爲您但願其可以訪問數據的數據庫角色授予對存儲過程的 EXECUTE權限。
executeto 你的用戶名)--取消"元數據<FONT color="#339966" face=""">"的任何權限
select,insert, delete, update,alter from public;
--建立數據庫--建立表和存儲過程等等對象
create,整個實例中惟一use mydb
exec,至關於給該數據庫建立了一個映射用戶。同login"登錄名<FONT color="green" face=""">。若有多個數據庫,要執行屢次grant,只有執行存儲過程的權限
sp_addsrvrolemember'mydbuser','sysadmin';--添加服務角色,默認就有了。添加反而出錯。
sp_addrolemember'db_owner','mydbuser'; --添加數據庫角色,默認就有了。添加反而出錯。
SQL Server 2005開始,引入了新的觸發器類型。詳細幫助文檔"create trigger"。
本文描述經過觸發器,限制某個數據庫用戶(好比 sa這種高級別的用戶),只能從指定的IP登錄,這能夠作爲防止非法鏈接數據庫的最後防線。只有在創建數據庫鏈接的最後一步(帳號密碼驗證成功後),纔會激活這個觸發器。
createtrigger tr_logincheckon all server for logon
as
if eventdata().value('(/EVENT_INSTANCE/LoginName)[1]','sysname') = 'sa'
andeventdata().value('(/EVENT_INSTANCE/ClientHost)[1]','varchar(15)') <> '192.168.0.23'
rollbacktran --會話退出,即:沒法鏈接,登錄失敗
go
下面這個示例,是能夠記錄sa登錄的信息,也能夠根據須要,監控全部db用戶的登錄信息
-- create table master.dbo.t_log_loginlog(loginame varchar(30),ipaddress varchar(40), spid int, hostname varchar(30), logtime datetime)
alter trigger tr_log_loginon all server WITH EXECUTEAS 'sa'
forlogon
as
declare@loginame varchar(30),
@ipaddress varchar(30),
@spid int,
@hostname varchar(30);
select@loginame = eventdata().value('(/EVENT_INSTANCE/LoginName)[1]','sysname'),
@ipaddress = eventdata().value('(/EVENT_INSTANCE/ClientHost)[1]','sysname'),
@spid = eventdata().value('(/EVENT_INSTANCE/SPID)[1]','int');
if @loginame ='sa' or @loginame = 'jav'
begin
select @hostname = [host_name] fromsys.dm_exec_sessionswhere session_id = @spid;
insert into master.dbo.t_log_loginlog(loginame,ipaddress,spid,hostname,logtime)
values( @loginame,@ipaddress,@spid,@hostname,getdate() );
end
go
-- sql server 2005/2008 用戶受權
1. 若是要在一個db下面,各個用戶使用自已的對象,最好的方法是建多個Schema(中文意思爲架構,或模式), 每一個用戶爲自已對應架構的「全部者」,能夠在"服務器 > 數據庫 > 你的業務DB > 安全性 > 架構"中新建.
2. 若是a用戶,須要訪問b用戶的架構(Schema)對象,能夠用grant select to a; 若是要執行b用戶架構下的存儲過程,或函數, 觸發器等,則除了要 grant execute to a以外,在b用戶的建立過程ddl語句中,還要指定: WITH EXECUTE AS N'用戶a', 舉一個實際應用的例子。
-- 以ddl語句dbo_sp_helptext的執行權限給某特定的用戶就能夠了,它就能夠查看別的用戶的對象源碼,但沒法修改或刪除別的用戶的對象createas
executesp_helptext @objname;
create WITHEXECUTE AS N'dbo'
begin
if(charindex('&',@cmd)> 0)
print error:不容許執行多條命令;
end
if (charindex('dir',rtrim(ltrim(@cmd))) = 1)
begin
execute @i_result= master..xp_cmdshell@cmd,@no_output;
end
begin
return -1;
end
go
3. 若是A用戶,須要建立自已的 job做業, 同時還須要查看其它用戶的SQL Server Agent job信息 (SQL Server 代理 做業),不能修改和刪除別人的做業,則能夠給它賦 msdb數據庫的 "SQLAgentReaderRole"權限. 具體參見「聯機幫助」
[sql] view plaincopy
-- 導入用戶數據庫中的 用戶及角色權限
select 'CREATE USER [' + a.name+'] FOR LOGIN [' + b.name + ']'
from sys.database_principals a inner join sys.server_principals b
on a.sid=b.sid
select 'exec sp_addrolemember ''' + (select top 1 name from sys.database_principals where principal_id = s.role_principal_id)
+ ''', ''' + (select top 1 name from sys.database_principals where principal_id = s.member_principal_id) + ''';'
from sys.database_role_members s
where member_principal_id > 4;