sql server常用語句總結

 -- 查看性能記數器

 
 
 
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;  
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章