May 17, 2026, 11:40 PM
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.database_id as database_id,
|
||||
is_ag_replica_local = CASE
|
||||
WHEN ar_state.is_local = 1 THEN N'LOCAL'
|
||||
ELSE 'REMOTE'
|
||||
END ,
|
||||
ag_replica_role = CASE
|
||||
WHEN ar_state.role_desc IS NULL THEN N'DISCONNECTED'
|
||||
ELSE ar_state.role_desc
|
||||
END,
|
||||
dr_state.last_hardened_time, dr_state.last_redone_time
|
||||
FROM (( sys.availability_groups AS ag JOIN sys.availability_replicas AS ar ON ag.group_id = ar.group_id )
|
||||
JOIN sys.dm_hadr_availability_replica_states AS ar_state ON ar.replica_id = ar_state.replica_id)
|
||||
JOIN sys.dm_hadr_database_replica_states dr_state
|
||||
on ag.group_id = dr_state.group_id and dr_state.replica_id = ar_state.replica_id
|
||||
-- Podajemy ID Bazy, którą sprawdzamy
|
||||
-- where dr_state.database_id = 35
|
||||
@@ -0,0 +1,190 @@
|
||||
# SQL-Server
|
||||
|
||||
## Przydatne linki
|
||||
Sporo materiału nie umieszczam celowo ponieważ nie chcę całości utrzymywać ale poniższe linki są bardzo przydatne i korzystam z nich dość często
|
||||
|
||||
[SQL Server - First Responder Kit](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit)
|
||||
|
||||
[SQL Server Kit](https://github.com/ktaranov/sqlserver-kit)
|
||||
|
||||
[PowerShell Kit](https://github.com/ktaranov/powershell-kit)
|
||||
|
||||
[SQL Stress Test](https://github.com/ErikEJ/SqlQueryStress)
|
||||
|
||||
[SQL Scipts](https://github.com/PavelPawlowski/SQL-Scripts)
|
||||
|
||||
[SQL Server Scripts Kendra](https://github.com/kendalvandyke/SQL-Server-Scripts)
|
||||
|
||||
[SQL Server PowerDoc](https://github.com/kendalvandyke/sqlpowerdoc)
|
||||
|
||||
[sp_whoisactive](https://github.com/amachanic/sp_whoisactive)
|
||||
|
||||
[dbatools](https://github.com/sqlcollaborative/dbatools)
|
||||
|
||||
[dbacheck](https://github.com/sqlcollaborative/dbachecks)
|
||||
|
||||
[JupyterNotebooks](https://github.com/SQLDBAWithABeard/JupyterNotebooks)
|
||||
|
||||
[SQL Server Maintenace Solution Ola Hallengren](https://github.com/olahallengren/sql-server-maintenance-solution)
|
||||
|
||||
[PowerShell tools](https://github.com/janikvonrotz/awesome-powershell)
|
||||
|
||||
|
||||
|
||||
## Oficjalne repozytoria Microsoft
|
||||
|
||||
[TigerBox](https://github.com/microsoft/tigertoolbox)
|
||||
|
||||
[Dokumentacja do SQL Server](https://github.com/MicrosoftDocs/sql-docs)
|
||||
|
||||
|
||||
|
||||
[SQL Server Sample Database](https://github.com/microsoft/sql-server-samples)
|
||||
|
||||
[Reporting Services Tools](https://github.com/microsoft/ReportingServicesTools)
|
||||
|
||||
|
||||
|
||||
|
||||
**Fora internetowe i inne**
|
||||
|
||||
[!!! **Tiger Tollbox ** !!!](https://github.com/Microsoft/tigertoolbox) - oficjalne repozytorium Microsoft SQL Server na GitHub
|
||||
|
||||
[Stack Exchange](https://dba.stackexchange.com/)
|
||||
|
||||
[SQL Server Central](https://www.sqlservercentral.com/)
|
||||
|
||||
[MS SQL Tips](https://www.mssqltips.com/sql-server-dba-resources/)
|
||||
|
||||
[PASS](https://www.pass.org/)
|
||||
|
||||
[Data Community](http://datacommunity.pl/)
|
||||
|
||||
[Microsoft SQL Server Versions List](http://sqlserverbuilds.blogspot.com/)
|
||||
|
||||
**Zasoby GitHub dla SQL Server**
|
||||
|
||||
[SQL Nexus](https://github.com/Microsoft/SqlNexus)
|
||||
|
||||
[SqlCeToolbox](https://github.com/ErikEJ/SqlCeToolbox)
|
||||
|
||||
[SQL Server PowerShell Extensions](https://github.com/MikeShepard/SQLPSX/)
|
||||
|
||||
|
||||
|
||||
**Ci ważniejsi od SQL Servera**
|
||||
|
||||
[SQL WorkBooks](https://sqlworkbooks.com)
|
||||
|
||||
[Brent Ozar](https://www.brentozar.com/)
|
||||
|
||||
[Kendra Little](https://littlekendra.com/)
|
||||
|
||||
[Ola Hallegren](https://ola.hallengren.com)
|
||||
|
||||
[Steve Mogran](https://seniordba.wordpress.com/)
|
||||
|
||||
[Pinal Dave SQL Authority](https://blog.sqlauthority.com/)
|
||||
|
||||
[Ben Miller](https://dbaduck.com/)
|
||||
|
||||
**Przydatne rozwiązania**
|
||||
|
||||
[Narzędzia do migracji i monitorowania **PowerShell**](https://dbatools.io)
|
||||
|
||||
[Opis pól dla Dashbordu Always On](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/use-the-always-on-dashboard-sql-server-management-studio?view=sql-server-2017)
|
||||
|
||||
[First Responder Kit from Brent Ozar](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/tree/master)
|
||||
|
||||
[SQL Server Maintenance Solution](https://github.com/olahallengren/sql-server-maintenance-solution )
|
||||
|
||||
[PowerShell for the SQL DBA](https://groupby.org/conference-session-abstracts/powershell-for-the-sql-dba/)
|
||||
|
||||
|
||||
|
||||
**MongoDB**
|
||||
[Podstawowe polecenia administracyjne](_pages/mongodb)
|
||||
|
||||
**Zaawanowane szkolenie Olnine by Brent Ozar**
|
||||
|
||||
[DBA Training Plan 1: Build a Server Inventory](https://www.brentozar.com/archive/2019/07/dba-training-plan-1-build-a-server-inventory/)
|
||||
|
||||
[DBA Training Plan 2: Backups (And More Importantly, Restores)](https://www.brentozar.com/archive/2019/07/dba-training-plan-2-backups-and-more-importantly-restores/)
|
||||
|
||||
[DBA Training Plan 3: Treat Your Servers Like Cattle, Not Like Pets](https://www.brentozar.com/archive/2019/07/dba-training-plan-3-automating-restores/ )
|
||||
|
||||
[DBA Training Plan 4: Checking for Corruption](https://www.brentozar.com/archive/2019/07/dba-training-plan-4-checking-for-corruption/)
|
||||
|
||||
[DBA Training Plan 5: Knowing Who Has Access](https://www.brentozar.com/archive/2019/07/dba-training-plan-5-knowing-who-has-access/)
|
||||
|
||||
[DBA Training Plan 6: How to Monitor Drive Space](https://www.brentozar.com/archive/2019/07/dba-training-plan-6-how-to-monitor-drive-space/)
|
||||
|
||||
[DBA Training Plan 7: How SQL Server Stores Stuff in MDF Files](https://www.brentozar.com/archive/2019/07/dba-training-plan-7-how-sql-server-stores-stuff-in-mdf-files/)
|
||||
|
||||
[DBA Training Plan 8: What’s Inside Your Own Databases](https://www.brentozar.com/archive/2019/08/dba-training-plan-8-whats-inside-your-own-databases/)
|
||||
|
||||
[DBA Training Plan 9: My 3 Index Guidelines](https://www.brentozar.com/archive/2019/08/dba-training-plan-9-my-3-index-guidelines/)
|
||||
|
||||
[DBA Training Plan 10: Managing Index Fragmentation](https://www.brentozar.com/archive/2019/08/dba-training-plan-10-managing-index-fragmentation/)
|
||||
|
||||
[DBA Training Plan 11: The Basics of Executing a Query](https://www.brentozar.com/archive/2019/08/dba-training-plan-11-the-basics-of-executing-a-query/)
|
||||
|
||||
[DBA Training Plan 12: What Query Plans Are In Cache?](https://www.brentozar.com/archive/2019/08/dba-training-plan-12-what-query-plans-are-in-cache/)
|
||||
|
||||
[DBA Training Plan 13: Why Do Cached Plans Go Bad?](https://www.brentozar.com/archive/2019/08/dba-training-plan-13-why-do-cached-plans-go-bad/)
|
||||
|
||||
[DBA Training Plan 14: POP QUIZ!](https://www.brentozar.com/archive/2019/08/dba-training-plan-14-pop-quiz/)
|
||||
|
||||
[DBA Training Plan 15: What’s Your SQL Server Waiting On?](https://www.brentozar.com/archive/2019/08/dba-training-plan-15-whats-your-sql-server-waiting-on/)
|
||||
|
||||
[DBA Training Plan 16: Is It Time to Scale Out?](https://www.brentozar.com/archive/2019/08/dba-training-plan-16-is-it-time-to-scale-out/)
|
||||
|
||||
[DBA Training Plan 17: Should You Partition Your Tables?](https://www.brentozar.com/archive/2019/09/dba-training-plan-17-should-you-partition-your-tables/)
|
||||
|
||||
[DBA Training Plan 18: Managing Concurrency](https://www.brentozar.com/archive/2019/09/dba-training-plan-18-managing-concurrency/)
|
||||
|
||||
[DBA Training Plan 19: The L-Word, Licensing](https://www.brentozar.com/archive/2019/09/dba-training-plan-19-the-l-word-licensing/)
|
||||
|
||||
[DBA Training Plan 20: Planning Your Next Server](https://www.brentozar.com/archive/2019/09/dba-training-plan-20-planning-your-next-server/)
|
||||
|
||||
|
||||
**First Responder Kit i więcej**
|
||||
|
||||
|
||||
[Welcome to SQL Server medical school!](https://www.brentozar.com/thanks/welcome-sql-server-medical-school/)
|
||||
|
||||
[How to Do a Free SQL Server Health Check](https://www.brentozar.com/archive/2017/10/free-sql-server-health-check/)
|
||||
|
||||
[How to Do a Free SQL Server Performance Check](https://www.brentozar.com/archive/2017/10/free-sql-server-performance-check/)
|
||||
|
||||
[How to Do a SQL Server Architecture Review](https://www.brentozar.com/archive/2017/10/sql-server-architecture-review/)
|
||||
|
||||
|
||||
**Indeksy**
|
||||
|
||||
[Stairway to SQL Server Indexes](https://www.sqlservercentral.com/stairways/stairway-to-sql-server-indexes)
|
||||
|
||||
[Stairway to Columnstore Indexes](https://www.sqlservercentral.com/stairways/stairway-to-columnstore-indexes)
|
||||
|
||||
[Indexing on Brent Ozar](https://www.brentozar.com/archive/category/indexing/)
|
||||
|
||||
[Are My SQL Server Indexes Being Used?](https://www.sqlservercentral.com/blogs/are-my-sql-server-indexes-being-used)
|
||||
|
||||
**Tabele**
|
||||
|
||||
[How to Update SQL Server Statistics for Big Tables](https://codingsight.com/how-to-update-sql-server-statistics-for-big-tables/)
|
||||
|
||||
|
||||
**Performance**
|
||||
|
||||
[SQL Server Database Activity Based on Transaction Log Backup Size](https://www.mssqltips.com/sqlservertip/6096/sql-server-database-activity-based-on-transaction-log-backup-size/)
|
||||
|
||||
**Bezpieczeństwo**
|
||||
|
||||
[Stairway to SQL Server Security Level 1: Overview of SQL Server Security](https://www.sqlservercentral.com/steps/stairway-to-sql-server-security-level-1-overview-of-sql-server-security)
|
||||
|
||||
===========
|
||||
1. index - skrypty dotyczące indeksów, statystyk i sprawdzania wydajności
|
||||
|
||||
Skrypt który pokazuje brakjące indeksów w bazach
|
||||
https://www.mssqltips.com/sqlservertip/1237/finding-primary-keys-and-missing-primary-keys-in-sql-server/
|
||||
@@ -0,0 +1,15 @@
|
||||
select *
|
||||
from (
|
||||
SELECT sp.stats_id, name, filter_definition, last_updated, rows, rows_sampled, steps, unfiltered_rows, modification_counter
|
||||
, stat.object_id
|
||||
FROM sys.stats AS stat
|
||||
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp) x
|
||||
inner join sys.objects obj on x.object_id = obj.object_id
|
||||
where obj.type = 'U'
|
||||
order by last_updated desc
|
||||
|
||||
|
||||
SELECT sp.stats_id, name, filter_definition, last_updated, rows, rows_sampled, steps, unfiltered_rows, modification_counter
|
||||
, stat.object_id
|
||||
FROM sys.stats AS stat
|
||||
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp
|
||||
@@ -0,0 +1,13 @@
|
||||
Use the below query to get details for all emails sent the same date:
|
||||
SELECT * FROM msdb..sysmail_mailitems WHERE sent_date > DATEADD(DAY, -1,GETDATE())
|
||||
And here is the complete query to get all the failed emails from the past 24 hours:
|
||||
SELECT items.subject ,
|
||||
items.recipients ,
|
||||
items.copy_recipients ,
|
||||
items.blind_copy_recipients ,
|
||||
items.last_mod_date ,
|
||||
l.description
|
||||
FROM msdb.dbo.sysmail_faileditems AS items
|
||||
LEFT OUTER JOIN msdb.dbo.sysmail_event_log AS l
|
||||
ON items.mailitem_id = l.mailitem_id
|
||||
WHERE items.last_mod_date > DATEADD(DAY, -1,GETDATE())
|
||||
@@ -0,0 +1,132 @@
|
||||
;WITH LAST_FULL_BACKUP_LIST AS
|
||||
(
|
||||
SELECT
|
||||
SYSDBLIST.name AS Name,
|
||||
MAX(BUSETS.backup_finish_date) AS Last_Backup_Finish_DateTime
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'tempdb'
|
||||
AND
|
||||
BUSETS.[type] ='D' OR BUSETS.[type] IS NULL
|
||||
GROUP BY
|
||||
SYSDBLIST.name
|
||||
)
|
||||
,
|
||||
LAST_DIFFERENTIAL_BACKUP_LIST
|
||||
AS
|
||||
(
|
||||
SELECT
|
||||
SYSDBLIST.name AS Name,
|
||||
MAX(BUSETS.backup_finish_date) AS Last_Backup_Finish_DateTime
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'TempDB'
|
||||
AND
|
||||
BUSETS.[type] ='I'
|
||||
GROUP BY
|
||||
SYSDBLIST.name
|
||||
)
|
||||
|
||||
,
|
||||
|
||||
LOG_BACKUP_LIST
|
||||
AS
|
||||
(
|
||||
SELECT
|
||||
SYSDBLIST.name AS Name,
|
||||
BUSETS.backup_finish_date AS Backup_Finish_DateTime,
|
||||
ROUND(((BUSETS.backup_size/1024)/1024),2) AS Backup_Size_MB,
|
||||
ROW_NUMBER() OVER(Partition by SYSDBLIST.name ORDER BY BUSETS.backup_finish_date DESC) AS RevOrderBuDate
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'TempDB'
|
||||
AND
|
||||
BUSETS.[type] ='L'
|
||||
)
|
||||
,
|
||||
LAST_LOG_BACKUP_LIST
|
||||
AS
|
||||
(SELECT
|
||||
Name,
|
||||
Backup_Finish_DateTime AS Last_Backup_Finish_DateTime,
|
||||
Backup_Size_MB AS Log_Backup_Size_MB
|
||||
FROM
|
||||
LOG_BACKUP_LIST
|
||||
WHERE
|
||||
RevOrderBuDate=1
|
||||
)
|
||||
SELECT
|
||||
case
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) <=1 then 'OK'
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) is null then 'ERROR'
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) > 3 then '!!'
|
||||
when DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE()) > 1 then '-->'
|
||||
end as Status,
|
||||
SERVERPROPERTY('Servername') AS ServerName,
|
||||
SYSDBLIST.name AS Database_Name,
|
||||
SYSDBLIST.Recovery_model_desc,
|
||||
CASE WHEN BUSETS.backup_set_id IS NULL THEN 'NO Backup' ELSE 'Backup Complete' END AS Backup_Completed,
|
||||
BUSETS.backup_start_date AS Backup_Start_DateTime,
|
||||
BUSETS.backup_finish_date AS Backup_Finish_DateTime,
|
||||
DATEDIFF(MINUTE, BUSETS.backup_start_date, BUSETS.backup_finish_date) AS Duration_Min,
|
||||
(DATEDIFF(DAY,BUSETS.backup_finish_date,GETDATE())) AS Days_Since_Last_Backup,
|
||||
|
||||
LASTDIFFBACKUP.Last_Backup_Finish_DateTime AS Last_Differential_Finish_DateTime,
|
||||
(DATEDIFF(DAY,LASTDIFFBACKUP.Last_Backup_Finish_DateTime ,GETDATE())) AS Days_Since_Last_Differential_Backup,
|
||||
LASTLOGBACKUP.Last_Backup_Finish_DateTime AS Last_Log_Finish_DateTime,
|
||||
(DATEDIFF(DAY,LASTLOGBACKUP.Last_Backup_Finish_DateTime,GETDATE()))AS Days_Since_Last_Log_Backup,
|
||||
LASTLOGBACKUP.Log_Backup_Size_MB AS LOG_Backup_Size_MB,
|
||||
CASE
|
||||
WHEN BUSETS.[type] = 'D' THEN 'Full Backup'
|
||||
WHEN BUSETS.[type] = 'I' THEN 'Differential Database'
|
||||
WHEN BUSETS.[type] = 'L' THEN 'Log'
|
||||
WHEN BUSETS.[type] = 'F' THEN 'File/Filegroup'
|
||||
WHEN BUSETS.[type] = 'G' THEN 'Differential File'
|
||||
WHEN BUSETS.[type] = 'P' THEN 'Partial'
|
||||
WHEN BUSETS.[type] = 'Q'THEN 'Differential partial'
|
||||
END AS Backup_Type,
|
||||
ROUND(((BUSETS.backup_size/1024)/1024),2) AS Backup_Size_MB
|
||||
FROM
|
||||
MASTER.sys.databases AS SYSDBLIST
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupset AS BUSETS
|
||||
ON
|
||||
SYSDBLIST.name = BUSETS.database_name
|
||||
LEFT OUTER JOIN
|
||||
msdb.dbo.backupmediafamily AS BUMEDFAM
|
||||
ON
|
||||
BUSETS.media_set_id = BUMEDFAM.media_set_id
|
||||
|
||||
INNER JOIN
|
||||
LAST_FULL_BACKUP_LIST AS LASTBACKUP
|
||||
ON
|
||||
SYSDBLIST.Name=LASTBACKUP.Name
|
||||
AND
|
||||
ISNULL(BUSETS.backup_finish_date,'01/01/1900') = ISNULL(LASTBACKUP. Last_Backup_Finish_DateTime,'01/01/1900')
|
||||
|
||||
LEFT OUTER JOIN
|
||||
LAST_DIFFERENTIAL_BACKUP_LIST AS LASTDIFFBACKUP
|
||||
ON
|
||||
SYSDBLIST.Name=LASTDIFFBACKUP.Name
|
||||
|
||||
LEFT OUTER JOIN
|
||||
LAST_LOG_BACKUP_LIST AS LASTLOGBACKUP
|
||||
ON
|
||||
SYSDBLIST.Name=LASTLOGBACKUP.Name
|
||||
WHERE
|
||||
SYSDBLIST.name<>'TempDB'
|
||||
@@ -0,0 +1,49 @@
|
||||
SET NOCOUNT ON
|
||||
GO
|
||||
SET quoted_identifier OFF
|
||||
DECLARE @dbname AS VARCHAR(80)
|
||||
DECLARE @msgdb AS VARCHAR(100)
|
||||
DECLARE @dbbkpname AS VARCHAR(80)
|
||||
DECLARE @dypart1 AS VARCHAR(2)
|
||||
DECLARE @dypart2 AS VARCHAR(3)
|
||||
DECLARE @dypart3 AS VARCHAR(4)
|
||||
DECLARE @currentdate AS VARCHAR(10)
|
||||
DECLARE @server_name AS VARCHAR(30)
|
||||
SELECT @server_name = @@servername
|
||||
SELECT @dypart1 = DATEPART(dd,GETDATE())
|
||||
SELECT @dypart2 = DATENAME(mm,GETDATE())
|
||||
SELECT @dypart3 = DATEPART(yy,GETDATE())
|
||||
SELECT @currentdate= @dypart1 + @dypart2 + @dypart3
|
||||
PRINT "#####################################################################"
|
||||
PRINT "# SERVERNAME : "+ @server_name + " DATE : "+ @currentdate +"#"
|
||||
PRINT "#####################################################################"
|
||||
PRINT "DatabaseName Full Diff TranLog"
|
||||
PRINT "##########################################################################################################################################"
|
||||
SELECT SUBSTRING(s.name,1,50) AS 'DATABASE Name',
|
||||
b.backup_start_date AS 'Full DB Backup Status',
|
||||
c.backup_start_date AS 'Differential DB Backup Status',
|
||||
d.backup_start_date AS 'Transaction Log Backup Status'
|
||||
FROM MASTER..sysdatabases s
|
||||
LEFT OUTER JOIN msdb..backupset b
|
||||
ON s.name = b.database_name
|
||||
AND b.backup_start_date =
|
||||
(SELECT MAX(backup_start_date)AS 'Full DB Backup Status'
|
||||
FROM msdb..backupset
|
||||
WHERE database_name = b.database_name
|
||||
AND TYPE = 'D') -- full database backups only, not log backups
|
||||
LEFT OUTER JOIN msdb..backupset c
|
||||
ON s.name = c.database_name
|
||||
AND c.backup_start_date =
|
||||
(SELECT MAX(backup_start_date)'Differential DB Backup Status'
|
||||
FROM msdb..backupset
|
||||
WHERE database_name = c.database_name
|
||||
AND TYPE = 'I')
|
||||
LEFT OUTER JOIN msdb..backupset d
|
||||
ON s.name = d.database_name
|
||||
AND d.backup_start_date =
|
||||
(SELECT MAX(backup_start_date)'Transaction Log Backup Status'
|
||||
FROM msdb..backupset
|
||||
WHERE database_name = d.database_name
|
||||
AND TYPE = 'L')
|
||||
WHERE s.name <>'tempdb'
|
||||
ORDER BY s.name
|
||||
@@ -0,0 +1,9 @@
|
||||
select
|
||||
a.name, b.total_elapsed_time/60000 as [Running time],
|
||||
b.estimated_completion_time/60000 as [Remaining],
|
||||
b.percent_complete as [%],
|
||||
(select text from sys.dm_exec_sql_text(b.sql_handle)) as command,
|
||||
b.wait_type
|
||||
from master..sysdatabases a, sys.dm_exec_requests b
|
||||
where a.dbid=b.database_id and b.command like '%BACKUP%'
|
||||
order by percent_complete desc, b.total_elapsed_time/60000 desc
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
select scheduler_id,cpu_id, status, is_online from sys.dm_os_schedulers where status='VISIBLE ONLINE'
|
||||
@@ -0,0 +1,571 @@
|
||||
---------------------------------------------------------------------------------
|
||||
-- The sample scripts are not supported under any Microsoft standard support
|
||||
-- program or service. The sample scripts are provided AS IS without warranty
|
||||
-- of any kind. Microsoft further disclaims all implied warranties including,
|
||||
-- without limitation, any implied warranties of merchantability or of fitness for
|
||||
-- a particular purpose. The entire risk arising out of the use or performance of
|
||||
-- the sample scripts and documentation remains with you. In no event shall
|
||||
-- Microsoft, its authors, or anyone else involved in the creation, production, or
|
||||
-- delivery of the scripts be liable for any damages whatsoever (including,
|
||||
-- without limitation, damages for loss of business profits, business interruption,
|
||||
-- loss of business information, or other pecuniary loss) arising out of the use
|
||||
-- of or inability to use the sample scripts or documentation, even if Microsoft
|
||||
-- has been advised of the possibility of such damages
|
||||
|
||||
-- The script is not compatible with SQL Server 2000 and SQL Server 2005, please upgrade your SQL Server to newer edition.
|
||||
---------------------------------------------------------------------------------
|
||||
|
||||
DECLARE @ProductVersion NVARCHAR(20)
|
||||
DECLARE @ProductLevel NVARCHAR(20)
|
||||
DECLARE @UpdateLevel NVARCHAR(20)
|
||||
DECLARE @UpdateRef NVARCHAR(20)
|
||||
DECLARE @UpdateRefOutput NVARCHAR(200) = ''
|
||||
DECLARE @Edition NVARCHAR(100)
|
||||
|
||||
DECLARE @ProductName NVARCHAR(30)
|
||||
DECLARE @TheLastVersion NVARCHAR(100)
|
||||
DECLARE @OtherProduct NVARCHAR(800)
|
||||
DECLARE @SPInfo NVARCHAR(400)
|
||||
DECLARE @CUInfo NVARCHAR(400)
|
||||
|
||||
DECLARE @CumulativeUpdate NVARCHAR(20)
|
||||
DECLARE @CumulativeUpdateKB NVARCHAR(100)
|
||||
DECLARE @EditionID sql_variant
|
||||
|
||||
DECLARE @ExtendedSupport NVARCHAR(500)
|
||||
DECLARE @MainSupportNonUpdate NVARCHAR(500)
|
||||
DECLARE @MainSupport NVARCHAR(500)
|
||||
|
||||
|
||||
DECLARE @2016E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Enterprise'
|
||||
DECLARE @2016BI NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Business Intelligence'
|
||||
DECLARE @2016Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Standard'
|
||||
DECLARE @2016Web NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Web'
|
||||
DECLARE @2016Exp NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Express'
|
||||
DECLARE @2016Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Developer'
|
||||
DECLARE @2016Eval NVARCHAR(50) = + CHAR(13) + 'SQL Server 2016 Evaluation'
|
||||
|
||||
DECLARE @2014E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Enterprise'
|
||||
DECLARE @2014BI NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Business Intelligence'
|
||||
DECLARE @2014Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Standard'
|
||||
DECLARE @2014Web NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Web'
|
||||
DECLARE @2014Exp NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Express'
|
||||
DECLARE @2014Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2014 Developer'
|
||||
|
||||
DECLARE @2012E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Enterprise'
|
||||
DECLARE @2012BI NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Business Intelligence'
|
||||
DECLARE @2012Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Standard'
|
||||
DECLARE @2012Web NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Web'
|
||||
DECLARE @2012Exp NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Express'
|
||||
DECLARE @2012Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2012 Developer'
|
||||
|
||||
DECLARE @2008R2E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Enterprise'
|
||||
DECLARE @2008R2Dat NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Datacenter'
|
||||
DECLARE @2008R2Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Standard'
|
||||
DECLARE @2008R2Wg NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Workgroup'
|
||||
DECLARE @2008R2Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Developer'
|
||||
DECLARE @2008R2ExpAdv NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 R2 Express with Advanced'
|
||||
|
||||
DECLARE @2008E NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Enterprise'
|
||||
DECLARE @2008Std NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Standard'
|
||||
DECLARE @2008Wg NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Workgroup'
|
||||
DECLARE @2008Dev NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Developer'
|
||||
DECLARE @2008ExpAdv NVARCHAR(50) = + CHAR(13) + 'SQL Server 2008 Express with Advanced'
|
||||
|
||||
SET @ExtendedSupport = 'Support Lifecycle stage: Extended Support Phase. For additional information refer to '
|
||||
+ CHAR(13) + 'https://support.microsoft.com/en-us/lifecycle/search?sort=PN&alpha=SQL%20Server&Filter=FilterNO, and Q6, Q18'
|
||||
+ CHAR(13) + 'in the FAQ section of Support Lifecycle page at: https://support.microsoft.com/en-us/lifecycle#gp/lifePolicy'
|
||||
|
||||
SET @MainSupportNonUpdate = 'Support Lifecycle stage: Mainstream Support Phase, however security/non-security updates are not available for'
|
||||
+ CHAR(13) + 'current 2012 baseline. Upgrade to SP2 for security/Non-security updates. For additional information refer to:'
|
||||
+ CHAR(13) + 'https://support.microsoft.com/en-us/lifecycle/search?sort=PN&alpha=SQL%20Server&Filter=FilterNO, and Q6, Q18'
|
||||
+ CHAR(13) + 'in the FAQ section of Support Lifecycle page at: https://support.microsoft.com/en-us/lifecycle#gp/lifePolicy'
|
||||
|
||||
SET @MainSupport = 'Support Lifecycle stage: Mainstream Support Phase. For additional information refer to '
|
||||
+ CHAR(13) + 'https://support.microsoft.com/en-us/lifecycle/search?sort=PN&alpha=SQL%20Server&Filter=FilterNO, and Q6, Q18'
|
||||
+ CHAR(13) + 'in the FAQ section of Support Lifecycle page at: https://support.microsoft.com/en-us/lifecycle#gp/lifePolicy'
|
||||
|
||||
SET @EditionID = SERVERPROPERTY('EditionID')
|
||||
SET @ProductVersion = CONVERT(NVARCHAR(20),SERVERPROPERTY('ProductVersion'))
|
||||
SET @ProductLevel = CONVERT(NVARCHAR(20),SERVERPROPERTY('ProductLevel'))
|
||||
SET @UpdateLevel = ISNULL(CONVERT(NVARCHAR(20),SERVERPROPERTY('ProductUpdateLevel')),'')
|
||||
SET @UpdateRef = ISNULL(CONVERT(NVARCHAR(20),SERVERPROPERTY('@UpdateRef')),'')
|
||||
SET @Edition = CONVERT(NVARCHAR(100),SERVERPROPERTY('Edition'))
|
||||
|
||||
SELECT @ProductName =
|
||||
CASE SUBSTRING(@ProductVersion,1,4)
|
||||
WHEN '13.0' THEN 'SQL Server 2016'
|
||||
WHEN '12.0' THEN 'SQL Server 2014'
|
||||
WHEN '11.0' THEN 'SQL Server 2012'
|
||||
WHEN '10.5' THEN 'SQL Server 2008 R2'
|
||||
WHEN '10.0' THEN 'SQL Server 2008'
|
||||
END,
|
||||
@TheLastVersion =
|
||||
CASE SUBSTRING(@ProductVersion,1,4)
|
||||
WHEN '13.0' THEN 'SQL Server 2016 RTM'
|
||||
WHEN '12.0' THEN 'SQL Server 2014 SP2'
|
||||
WHEN '11.0' THEN 'SQL Server 2012 SP3 CU4'
|
||||
WHEN '10.5' THEN 'SQL Server 2008 R2 SP3'
|
||||
WHEN '10.0' THEN 'SQL Server 2008 SP4'
|
||||
END
|
||||
|
||||
|
||||
DECLARE @Temp1 NVARCHAR(100) = 'You have already installed the latest service pack.'
|
||||
DECLARE @Temp12 NVARCHAR(100) = 'Install the latest service pack: '
|
||||
SELECT @SPInfo =
|
||||
CASE @ProductName
|
||||
WHEN 'SQL Server 2016' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'RTM' THEN @Temp1 ELSE @Temp12 + 'RTM, <https://support.microsoft.com/en-us/kb/3177534>'
|
||||
END
|
||||
WHEN 'SQL Server 2014' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP2' THEN @Temp1 ELSE @Temp12 + 'SP2, <https://support.microsoft.com/en-us/kb/3171021>'
|
||||
END
|
||||
WHEN 'SQL Server 2012' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP3' THEN @Temp1 ELSE @Temp12 + 'SP3, <https://support.microsoft.com/en-us/kb/3072779>'
|
||||
END
|
||||
WHEN 'SQL Server 2008 R2' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP3' THEN @Temp1 ELSE @Temp12 + 'SP3, <https://support.microsoft.com/en-us/kb/2979597>'
|
||||
END
|
||||
WHEN 'SQL Server 2008' THEN
|
||||
CASE @ProductLevel
|
||||
WHEN 'SP4' THEN @Temp1 ELSE @Temp12 + 'SP4, <https://support.microsoft.com/en-us/kb/2979596>'
|
||||
END
|
||||
END,
|
||||
@CUInfo =
|
||||
CASE @ProductName
|
||||
WHEN 'SQL Server 2016' THEN
|
||||
CASE @ProductVersion
|
||||
WHEN '13.0.2164.0' THEN 'You have already installed the latest cumulative update.'
|
||||
ELSE 'Install the latest Cumulative Update (CU) of RTM: CU2, <https://support.microsoft.com/en-us/kb/3182270>'
|
||||
END
|
||||
WHEN 'SQL Server 2014' THEN
|
||||
CASE @ProductVersion
|
||||
WHEN '12.0.5522.0' THEN 'You have already installed the latest cumulative update.'
|
||||
ELSE 'Install the latest Cumulative Update (CU) of SP2: CU2, <https://support.microsoft.com/en-us/kb/2936603>'
|
||||
END
|
||||
WHEN 'SQL Server 2012' THEN
|
||||
CASE @ProductVersion
|
||||
WHEN '11.0.6544.0' THEN 'You have already installed the latest cumulative update.'
|
||||
ELSE 'Install the latest Cumulative Update (CU) of SP3: CU5, <https://support.microsoft.com/en-us/kb/3180915>'
|
||||
END
|
||||
|
||||
--WHEN 'SQL Server 2008 R2' THEN
|
||||
--WHEN 'SQL Server 2008' THEN
|
||||
END
|
||||
|
||||
IF (@UpdateRef <> '')
|
||||
BEGIN
|
||||
SET @UpdateRefOutput = @UpdateRef + ' (' + 'https://support.microsoft.com/kb/'+SUBSTRING(@UpdateRef,3,10)+ ')'
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008')
|
||||
BEGIN
|
||||
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '10.00.1835.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU10'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/979064';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '10.00.2850.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU16'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2582282';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '10.00.4333.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU11'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2715951';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP3') AND (@ProductVersion < '10.00.5861.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU17'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2958696';
|
||||
END
|
||||
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel IN ('RTM','SP1') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2008R2E+@2008R2Dat
|
||||
WHEN @EditionID = -1534726760 THEN @2008R2E+@2008R2Dat+@2008R2Std
|
||||
WHEN @EditionID = -2117995310 THEN @2008R2Dat+@2008R2Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2008R2E+@2008R2Dat+@2008R2Std+@2008R2Wg+@2008R2Dev+@2008R2ExpAdv
|
||||
END
|
||||
|
||||
WHEN @ProductLevel = 'SP2' THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2008R2E+@2008R2Dat + @2012E+@2012BI
|
||||
WHEN @EditionID = -1534726760 THEN @2008R2E+@2008R2Dat+@2008R2Std + @2012E+@2012BI+@2012Std
|
||||
WHEN @EditionID = -2117995310 THEN @2008R2Dat+@2008R2Dev + @2012Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2008R2E+@2008R2Dat+@2008R2Std+@2008R2Wg+@2008R2Dev+@2008R2ExpAdv
|
||||
+ @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
END
|
||||
|
||||
WHEN @ProductLevel IN('SP3','SP4') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2008R2E+@2008R2Dat + @2012E+@2012BI + @2014E+@2014BI + @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2008R2E+@2008R2Dat+@2008R2Std + @2012E+@2012BI+@2012Std
|
||||
+ @2014E+@2014BI+@2014Std + @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2008R2Dat+@2008R2Dev + @2012Dev + @2014Dev + @2016Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2008R2E+@2008R2Dat+@2008R2Std+@2008R2Wg+@2008R2Dev+@2008R2ExpAdv
|
||||
+ @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
+ @2014E+@2014BI+@2014Std+@2014Web+@2014Exp
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008 R2')
|
||||
BEGIN
|
||||
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '10.50.1815.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU13'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2679366';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '10.50.2881.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU14'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2868244';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '10.50.4319.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU13'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2967540';
|
||||
END
|
||||
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel = 'RTM' THEN ' If you want to upgrade to higher edition, please intall service pack.'
|
||||
WHEN @ProductLevel = 'SP1' THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2012E+@2012BI
|
||||
WHEN @EditionID = -1534726760 THEN @2012E+@2012BI+@2012Std
|
||||
WHEN @EditionID = -2117995310 THEN @2012Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
END
|
||||
WHEN @ProductLevel IN('SP2','SP3','SP4') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2012E+@2012BI + @2014E+@2014BI + @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2012E+@2012BI+@2012Std + @2014E+@2014BI+@2014Std + @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2012Dev + @2014Dev + @2016Dev
|
||||
WHEN @Edition LIKE 'Express%' THEN @2012E+@2012BI+@2012Std+@2012Web+@2012Exp
|
||||
+ @2014E+@2014BI+@2014Std+@2014Web+@2014Exp
|
||||
+ @2016E+@2016BI+@2016Std+@2016Web+@2016Exp
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2012')
|
||||
BEGIN
|
||||
|
||||
--2012
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '11.0.3000.00')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU11'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2908007';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '11.0.3487.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU16'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3052476';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '11.0.5657.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU14'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3180914';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP3') AND (@ProductVersion < '11.0.6544.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU5'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3180915';
|
||||
END
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel = 'RTM' THEN ' If you want to upgrade to higher edition, please intall service pack.'
|
||||
WHEN @ProductLevel IN('SP1','SP2','SP3','SP4') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2014E+@2014BI + @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2014E+@2014BI+@2014Std + @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2014Dev + @2016E+@2016BI+@2016Std+@2016Web+@2016Dev
|
||||
WHEN @EditionID = -610778273 THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Dev+@2016Eval
|
||||
WHEN @Edition LIKE 'Express%' THEN @2014E+@2014BI+@2014Std+@2014Web+@2014Exp
|
||||
+ @2016E+@2016BI+@2016Std+@2016Web+@2016Exp+@2016Dev
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014')
|
||||
BEGIN
|
||||
|
||||
--2014
|
||||
IF (@ProductLevel = 'RTM') AND (@ProductVersion < '12.0.2569.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU14'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3158271';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP1') AND (@ProductVersion < '12.0.4474.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU9'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/3186964';
|
||||
END
|
||||
ELSE IF (@ProductLevel = 'SP2') AND (@ProductVersion < '12.0.5522.0')
|
||||
BEGIN
|
||||
SET @CumulativeUpdate = 'CU2'; SET @CumulativeUpdateKB = 'https://support.microsoft.com/en-us/kb/2936603';
|
||||
END
|
||||
|
||||
SELECT @OtherProduct =
|
||||
CASE
|
||||
WHEN @ProductLevel IN ('RTM','SP1','SP2') THEN
|
||||
CASE
|
||||
WHEN @EditionID IN (1804890536,1872460670) THEN @2016E+@2016BI
|
||||
WHEN @EditionID = -1534726760 THEN @2016E+@2016BI+@2016Std
|
||||
WHEN @EditionID = -2117995310 THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Dev
|
||||
WHEN @EditionID = -610778273 THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Dev+@2016Eval
|
||||
WHEN @Edition LIKE 'Express%' THEN @2016E+@2016BI+@2016Std+@2016Web+@2016Exp+@2016Dev
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
------------------------------------------------------------
|
||||
--//Begin GDR or QFE ///////////////////////////////////////
|
||||
------------------------------------------------------------
|
||||
DECLARE @SecurityUpdate NVARCHAR(100)
|
||||
DECLARE @GDR NVARCHAR(2000) = ''
|
||||
DECLARE @QFE NVARCHAR(2000) = ''
|
||||
DECLARE @GDRorQFE TINYINT = 0
|
||||
DECLARE @Build NVARCHAR(20) = SUBSTRING(@ProductVersion,1,9)
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014')
|
||||
BEGIN
|
||||
|
||||
IF (@Build in ('12.0.2000','12.0.4100'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('12.0.2381','12.0.2548'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('12.0.2254','12.0.2269','12.0.4213'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
SET @QFE = @QFE
|
||||
--+ CHAR(13) + '12.0.2381 (SQL Server 2014 RTM QFE) https://support.microsoft.com/en-us/kb/2977316'
|
||||
+ CHAR(13) + '12.0.2548 (SQL Server 2014 RTM QFE) http://support.microsoft.com/en-us/kb/3045323'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '12.0.2254 (SQL Server 2014 RTM GDR) http://support.microsoft.com/kb/2977315/en-us'
|
||||
+ CHAR(13) + '12.0.2269 (SQL Server 2014 RTM GDR) http://support.microsoft.com/en-us/kb/3045324'
|
||||
+ CHAR(13) + '12.0.4213 (SQL Server 2014 SP1 GDR) https://support.microsoft.com/en-us/kb/3070446'
|
||||
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2012')
|
||||
BEGIN
|
||||
--1:RTM SP
|
||||
--2:QFE
|
||||
--3:GDR
|
||||
--4:CU
|
||||
IF (@Build in ('11.0.2100','11.0.3000','11.0.5058','11.0.6020'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('11.0.2376','11.0.3460','11.0.3513','11.0.5613'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('11.0.2218','11.0.3153','11.0.3156','11.0.5343'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
SET @QFE = @QFE
|
||||
+ CHAR(13) + '11.0.2376 (SQL Server 2012 RTM QFE) http://support.microsoft.com/en-us/kb/2716441'
|
||||
--+ CHAR(13) + '11.0.3460 (SQL Server 2012 SP1 QFE) http://support.microsoft.com/kb/2977325/en-us'
|
||||
+ CHAR(13) + '11.0.3513 (SQL Server 2012 SP1 QFE) https://support.microsoft.com/en-us/kb/3045317'
|
||||
+ CHAR(13) + '11.0.5613 (SQL Server 2012 SP2 QFE) https://support.microsoft.com/en-us/kb/3045319'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '11.0.2218 (SQL Server 2012 RTM GDR) https://support.microsoft.com/en-us/kb/2716442'
|
||||
+ CHAR(13) + '11.0.3153 (SQL Server 2012 SP1 GDR) http://support.microsoft.com/kb/2977326/en-us'
|
||||
+ CHAR(13) + '11.0.3156 (SQL Server 2012 SP1 GDR) https://support.microsoft.com/en-us/kb/3045318'
|
||||
+ CHAR(13) + '11.0.5343 (SQL Server 2012 SP2 GDR) https://support.microsoft.com/en-us/kb/3045321'
|
||||
|
||||
END
|
||||
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008 R2')
|
||||
BEGIN
|
||||
|
||||
IF (@Build in ('10.50.1600','10.50.2500','10.50.4000','10.50.6000'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('10.50.1790','10.50.2861','10.50.4321','10.50.4339','10.50.6220','10.50.6529'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('10.50.1617','10.50.2550','10.50.4033','10.50.4042'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
SET @QFE = @QFE
|
||||
+ CHAR(13) + '10.50.1790 (SQL Server 2008 R2 RTM QFE) http://support.microsoft.com/kb/2494086'
|
||||
+ CHAR(13) + '10.50.2861 (SQL Server 2008 R2 SP1 QFE) http://support.microsoft.com/kb/2716439'
|
||||
+ CHAR(13) + '10.50.4339 (SQL Server 2008 R2 SP2 QFE) http://support.microsoft.com/kb/3045312/en-us'
|
||||
+ CHAR(13) + '10.50.6529 (SQL Server 2008 R2 SP3 QFE) http://support.microsoft.com/kb/3045314/en-us'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '10.50.1617 (SQL Server 2008 R2 RTM GDR) http://support.microsoft.com/kb/2494088'
|
||||
+ CHAR(13) + '10.50.2550 (SQL Server 2008 R2 SP1 GDR) http://technet.microsoft.com/en-us/security/bulletin/ms12-070'
|
||||
+ CHAR(13) + '10.50.4033 (SQL Server 2008 R2 SP2 GDR) http://support.microsoft.com/kb/2977320/en-us'
|
||||
+ CHAR(13) + '10.50.4042 (SQL Server 2008 R2 SP2 GDR) http://support.microsoft.com/kb/3045313/en-us'
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2008')
|
||||
BEGIN
|
||||
|
||||
IF (@Build in ('10.00.1600','10.00.2531','10.00.4000','10.00.5500','10.00.6000'))
|
||||
SET @GDRorQFE = 1
|
||||
ELSE IF (@Build in ('10.00.2841','10.00.4311','10.00.4371','10.00.5826','10.00.5869','10.00.5890','10.00.6535'))
|
||||
SET @GDRorQFE = 2
|
||||
ELSE IF (@Build in ('10.00.2573','10.00.4064','10.00.4067','10.00.5512','10.00.5520','10.00.5538','10.00.6241'))
|
||||
SET @GDRorQFE = 3
|
||||
ELSE
|
||||
SET @GDRorQFE = 4
|
||||
|
||||
|
||||
SET @QFE = @QFE
|
||||
+ CHAR(13) + '10.00.2841 (SQL Server 2008 SP1 QFE) https://support.microsoft.com/en-us/kb/2494100'
|
||||
+ CHAR(13) + '10.00.4371 (SQL Server 2008 SP2 QFE) http://support.microsoft.com/en-us/kb/2716433'
|
||||
+ CHAR(13) + '10.00.5890 (SQL Server 2008 SP3 QFE) https://support.microsoft.com/en-us/kb/3045303'
|
||||
+ CHAR(13) + '10.00.6535 (SQL Server 2008 SP4 QFE) http://support.microsoft.com/kb/3045308/en-us'
|
||||
|
||||
SET @GDR = @GDR
|
||||
+ CHAR(13) + '10.00.2573 (SQL Server 2008 SP1 GDR) http://support.microsoft.com/kb/2494096'
|
||||
+ CHAR(13) + '10.00.4064 (SQL Server 2008 SP2 GDR) http://support.microsoft.com/kb/2494089'
|
||||
+ CHAR(13) + '10.00.4067 (SQL Server 2008 SP2 GDR) http://support.microsoft.com/en-us/kb/2716434'
|
||||
+ CHAR(13) + '10.00.5512 (SQL Server 2008 SP3 GDR) http://support.microsoft.com/en-us/kb/2716436'
|
||||
+ CHAR(13) + '10.00.5520 (SQL Server 2008 SP3 GDR) http://support.microsoft.com/kb/2977321/en-us'
|
||||
+ CHAR(13) + '10.00.5538 (SQL Server 2008 SP3 GDR) https://support.microsoft.com/en-us/kb/3045305'
|
||||
+ CHAR(13) + '10.00.6241 (SQL Server 2008 SP4 GDR) https://support.microsoft.com/en-us/kb/3045311'
|
||||
END
|
||||
|
||||
IF @GDRorQFE = 2
|
||||
SET @SecurityUpdate = '+ Security update(QFE branch)'
|
||||
ELSE IF @GDRorQFE = 3
|
||||
SET @SecurityUpdate = '+ Security update(GDR)'
|
||||
ELSE
|
||||
SET @SecurityUpdate = ''
|
||||
|
||||
------------------------------------------------------------
|
||||
--//GDR or QFE end /////////////////////////////////////////
|
||||
------------------------------------------------------------
|
||||
|
||||
--begin output results
|
||||
--//Your current Microsoft SQL Server information:
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '--//Your current Microsoft SQL Server information:'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Product Version: ' + @ProductVersion
|
||||
PRINT 'Product Name: ' + @ProductName
|
||||
PRINT 'Product Level: ' + @ProductLevel + ' ' + @SecurityUpdate
|
||||
PRINT 'Product Edition: ' + @Edition
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014')
|
||||
AND ((@ProductLevel = 'RTM' AND SUBSTRING(@UpdateLevel,3,4) >= 10)
|
||||
OR (@ProductLevel = 'SP1' AND SUBSTRING(@UpdateLevel,3,4) >= 3)
|
||||
OR (@ProductLevel > 'SP1'))
|
||||
BEGIN
|
||||
PRINT 'Product Update Level: ' + @UpdateLevel
|
||||
PRINT 'Product Update Reference: ' + @UpdateRefOutput
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
IF (@ProductName = 'SQL Server 2014' AND @ProductLevel = 'RTM' AND SUBSTRING(@UpdateLevel,3,4) < 10)
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you want to know information about CU, you need to intall'
|
||||
+ CHAR(13) + 'SQL Server 2014 RTM Cumulative Update 10. CU10, <https://support.microsoft.com/en-us/kb/3094220>'
|
||||
+ CHAR(13) + REPLICATE(' ',50) + '- see KB3094220 to get the Cumulative Update 10'
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL Server 2014' AND @ProductLevel = 'SP1' AND SUBSTRING(@UpdateLevel,3,4) < 3)
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you want to know information about CU, you need to intall'
|
||||
+ CHAR(13) + 'SQL Server 2014 SP1 Cumulative Update 3. CU3, <https://support.microsoft.com/en-us/kb/3094221>'
|
||||
+ CHAR(13) + REPLICATE(' ',50) + '- see KB3094221 to get the Cumulative Update 3'
|
||||
END
|
||||
|
||||
IF (@ProductName <> 'SQL Server 2014')
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you want to know information about CU, please read this KB below.'
|
||||
+ CHAR(13) + 'KB321185,' + ' <https://support.microsoft.com/en-us/kb/321185>'
|
||||
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
|
||||
--//lifecycle Support
|
||||
IF (@ProductName = 'SQL server 2008' OR @ProductName = 'SQL server 2008 R2')
|
||||
BEGIN
|
||||
PRINT @ExtendedSupport
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL server 2012')
|
||||
BEGIN
|
||||
IF @ProductLevel = 'SP2' OR @ProductLevel = 'SP3'
|
||||
PRINT @MainSupport
|
||||
ELSE
|
||||
PRINT @MainSupportNonUpdate
|
||||
END
|
||||
|
||||
IF (@ProductName = 'SQL server 2014' OR @ProductName = 'SQL server 2016')
|
||||
BEGIN
|
||||
PRINT @MainSupport
|
||||
END
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Full information:' + CHAR(13) + @@VERSION
|
||||
|
||||
--//Recommended Updates:
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '--//Recommended updates: '--Upgrade to ' + @TheLastVersion
|
||||
PRINT '--### RTM -> QFE or GDR'
|
||||
PRINT '--### SP -> QFE or GDR'
|
||||
PRINT '--### QFE -> QFE'
|
||||
PRINT '--### GDR -> GDR or QFE'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT @SPInfo
|
||||
|
||||
IF @CUInfo IS NOT NULL
|
||||
PRINT @CUInfo
|
||||
PRINT ''
|
||||
|
||||
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '###### QFE branch updates'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT SUBSTRING(@QFE,2,2000)
|
||||
|
||||
IF (@GDRorQFE in (1,3))
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '###### GDR branch updates'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT SUBSTRING(@GDR,2,2000)
|
||||
END
|
||||
|
||||
IF @CumulativeUpdate IS NOT NULL
|
||||
BEGIN
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT 'Note, if you don''t want to upgrade to latest service pack right now, we recommend you install the latest'
|
||||
+ CHAR(13) + 'Cumulative Update ' + @CumulativeUpdate + ' of ' + @ProductName + ' ' + @ProductLevel + '.'
|
||||
+ CHAR(13) + 'Install the latest Cumulative Update (CU) of ' + @ProductLevel + ': ' + @CumulativeUpdate +', <' + @CumulativeUpdateKB + '>'
|
||||
END
|
||||
|
||||
|
||||
--//You can upgrade to any of the following product(s):
|
||||
PRINT CHAR(13)
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT '--//You can upgrade to any of the following product(s):'
|
||||
PRINT REPLICATE('-',105)
|
||||
PRINT SUBSTRING(@OtherProduct,2,800)
|
||||
PRINT CHAR(13)
|
||||
PRINT 'For additional information about supported version and edition upgrades refer to:'
|
||||
+ CHAR(13) +'https://technet.microsoft.com/en-us/library/ms143393(v=sql.120).aspx'
|
||||
GO
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
SELECT create_date
|
||||
FROM sys.server_principals
|
||||
WHERE sid = 0x010100000000000512000000
|
||||
@@ -0,0 +1,14 @@
|
||||
create table #SVer(ID int, Name sysname, Internal_Value int, Value nvarchar(512)) insert #SVer exec master.dbo.xp_msver
|
||||
declare @SmoRoot nvarchar(512)
|
||||
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT
|
||||
|
||||
SELECT
|
||||
serverproperty('ComputerNamePhysicalNetBIOS') as HostName,
|
||||
serverproperty(N'Servername') AS [Instance_Name],
|
||||
(select Value from #SVer where Name = N'ProductName') AS [Product],
|
||||
CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition],
|
||||
SERVERPROPERTY(N'ProductVersion') AS [VersionString]
|
||||
|
||||
|
||||
drop table #SVer
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
select @@servername as ServerName, a.Name as JobName, a.enabled, a.start_step_id, b.message, b.run_status, b.run_date as RunDate,
|
||||
substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 1, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 3, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar), 5, 2) as RunTime,
|
||||
substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 1, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 3, 2) +
|
||||
':' + substring(replicate('0', 6 - len(b.run_duration)) + cast(b.run_duration as varchar), 5, 2) as DurationSec
|
||||
from msdb..sysjobs a with (nolock)
|
||||
join msdb..sysjobhistory b with (nolock) on a.job_id = b.job_id
|
||||
where run_status not in (1,4)
|
||||
and cast(cast(b.run_date as varchar) as datetime) > getdate() - 3
|
||||
order by run_date desc, run_time desc
|
||||
|
||||
|
||||
select @@servername as ServerName, a.Name as JobName,
|
||||
a.enabled, a.start_step_id,
|
||||
b.message, b.run_status,
|
||||
b.run_date as RunDate,
|
||||
substring(run_time, 1, 2) + ':' + substring(run_time, 3, 2) + ':' + substring(run_time, 5, 2) as RunTime,
|
||||
b.run_duration as DurationSec
|
||||
from msdb..sysjobs a with (nolock)
|
||||
cross apply (
|
||||
select top 15 b.message, b.run_status,
|
||||
cast(b.run_date as varchar) as run_date, replicate('0', 6 - len(b.run_time)) + cast(b.run_time as varchar) as run_time,
|
||||
b.run_duration
|
||||
from msdb..sysjobhistory b with (nolock)
|
||||
where b.step_id = 0
|
||||
and a.job_id = b.job_id
|
||||
order by run_date desc, run_time desc
|
||||
) b
|
||||
where run_status <> 1
|
||||
and cast(cast(b.run_date as varchar) as datetime) > getdate() - 2
|
||||
order by name, run_date desc, run_time desc
|
||||
go
|
||||
|
||||
create table #errorlog(logdate datetime, processinfo varchar(255), info varchar(MAX))
|
||||
|
||||
insert into #errorlog
|
||||
exec xp_readerrorlog
|
||||
|
||||
select * from #errorlog
|
||||
where logdate > getdate() - 2
|
||||
and left(info, 29) <> 'Log was backed up. Database: '
|
||||
and left(info, 20) <> 'Starting up database'
|
||||
and left(info, 28) <> 'Log was restored. Database: '
|
||||
and right(info, 34) <> 'does not allow recovery to be run.'
|
||||
and info <> 'Error: 18456, Severity: 14, State: 8.'
|
||||
and info <> 'Error: 18054, Severity: 16, State: 1.'
|
||||
and LEFT(info, 11) <> 'Error: 6000'
|
||||
and LEFT(info, 3) <> 'IDS'
|
||||
and info <> 'Error: 18452, Severity: 14, State: 1.'
|
||||
and info <> 'Error: 17806, Severity: 20, State: 14.'
|
||||
-- and info like '%request%'
|
||||
|
||||
order by logdate
|
||||
drop table #errorlog
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
|
||||
A Simple script to verify whether your SQL Server is running on a Physical Box or a Virtual machine without RDP'ing into your server.
|
||||
|
||||
Note: This Script works only on 2008R2 SP1 and above..
|
||||
|
||||
*/
|
||||
|
||||
SELECT SERVERPROPERTY('computernamephysicalnetbios') AS ServerName
|
||||
,dosi.virtual_machine_type_desc
|
||||
,Server_type = CASE
|
||||
WHEN dosi.virtual_machine_type = 1
|
||||
THEN 'Virtual'
|
||||
ELSE 'Physical'
|
||||
END
|
||||
FROM sys.dm_os_sys_info dosi
|
||||
|
||||
|
||||
|
||||
/* If you have a CMS configured, run the below Script from your CMS against multiple servers*/
|
||||
|
||||
|
||||
SELECT dosi.virtual_machine_type_desc
|
||||
,Server_type = CASE
|
||||
WHEN dosi.virtual_machine_type = 1
|
||||
THEN 'Virtual'
|
||||
ELSE 'Physical'
|
||||
END
|
||||
FROM sys.dm_os_sys_info dosi
|
||||
+1245
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+3909
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+3962
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,46 @@
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will return information about indexes and index usage. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/1545/deeper-insight-into-used-and-unused-indexes-for-sql-server/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT PVT.SCHEMANAME, PVT.TABLENAME, PVT.INDEXNAME, PVT.INDEX_ID, [1] AS COL1, [2] AS COL2, [3] AS COL3, [4] AS COL4, [5] AS COL5, [6] AS COL6, [7] AS COL7, B.USER_SEEKS, B.USER_SCANS, B.USER_LOOKUPS, B.USER_UPDATES
|
||||
FROM (SELECT SCHEMA_NAME(A.SCHEMA_id) AS SCHEMANAME,
|
||||
A.NAME AS TABLENAME,
|
||||
A.OBJECT_ID,
|
||||
B.NAME AS INDEXNAME,
|
||||
B.INDEX_ID,
|
||||
D.NAME AS COLUMNNAME,
|
||||
C.KEY_ORDINAL
|
||||
FROM SYS.OBJECTS A
|
||||
INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID
|
||||
LEFT JOIN SYS.INDEX_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID
|
||||
LEFT JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID
|
||||
WHERE A.TYPE = 'U') P
|
||||
PIVOT
|
||||
(MIN(COLUMNNAME)
|
||||
FOR KEY_ORDINAL IN ( [1],[2],[3],[4],[5],[6],[7] ) ) AS PVT
|
||||
INNER JOIN SYS.DM_DB_INDEX_USAGE_STATS B ON PVT.OBJECT_ID = B.OBJECT_ID AND PVT.INDEX_ID = B.INDEX_ID AND B.DATABASE_ID = DB_ID()
|
||||
UNION -- below returns indexes not used with usage information
|
||||
SELECT SCHEMANAME, TABLENAME, INDEXNAME, INDEX_ID, [1] AS COL1, [2] AS COL2, [3] AS COL3, [4] AS COL4, [5] AS COL5, [6] AS COL6, [7] AS COL7, 0, 0, 0, 0
|
||||
FROM (SELECT SCHEMA_NAME(A.SCHEMA_id) AS SCHEMANAME,
|
||||
A.NAME AS TABLENAME,
|
||||
A.OBJECT_ID,
|
||||
B.NAME AS INDEXNAME,
|
||||
B.INDEX_ID,
|
||||
D.NAME AS COLUMNNAME,
|
||||
C.KEY_ORDINAL
|
||||
FROM SYS.OBJECTS A
|
||||
INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID
|
||||
LEFT JOIN SYS.INDEX_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID
|
||||
LEFT JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID
|
||||
WHERE A.TYPE = 'U') P
|
||||
PIVOT
|
||||
(MIN(COLUMNNAME)
|
||||
FOR KEY_ORDINAL IN ( [1],[2],[3],[4],[5],[6],[7] ) ) AS PVT
|
||||
WHERE NOT EXISTS (SELECT OBJECT_ID,
|
||||
INDEX_ID
|
||||
FROM SYS.DM_DB_INDEX_USAGE_STATS B
|
||||
WHERE DATABASE_ID = DB_ID(DB_NAME())
|
||||
AND PVT.OBJECT_ID = B.OBJECT_ID
|
||||
AND PVT.INDEX_ID = B.INDEX_ID)
|
||||
ORDER BY SCHEMANAME, TABLENAME, INDEX_ID;
|
||||
@@ -0,0 +1,22 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will list all indexes in the database and show index columns and included columns. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT
|
||||
SCHEMA_NAME(ss.SCHEMA_id) AS SchemaName,
|
||||
ss.name as TableName,
|
||||
ss2.name as IndexName,
|
||||
ss2.index_id,
|
||||
ss2.type_desc,
|
||||
STUFF((SELECT ', ' + name
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 0
|
||||
ORDER BY a.key_ordinal
|
||||
FOR XML PATH('')), 1, 2, '') IndexColumns,
|
||||
STUFF((SELECT ', ' + name
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 1
|
||||
FOR XML PATH('')), 1, 2, '') IncludedColumns
|
||||
FROM sys.objects SS INNER JOIN sys.indexes ss2 ON ss.OBJECT_ID = ss2.OBJECT_ID
|
||||
WHERE ss.type = 'U'
|
||||
ORDER BY 1, 2, 3
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will list all indexes in the database and show index columns and included columns using STRING_AGG (SQL 2017 and later). Run this in the user database.
|
||||
-- More Information:
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT
|
||||
SCHEMA_NAME(ss.SCHEMA_id) AS SCHEMANAME,
|
||||
ss.name as TableName,
|
||||
ss2.name as IndexName,
|
||||
ss2.index_id,
|
||||
(SELECT STRING_AGG(name,', ')
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 0
|
||||
) as IndexColumns,
|
||||
(SELECT STRING_AGG(name,', ')
|
||||
FROM sys.index_columns a INNER JOIN sys.all_columns b ON a.object_id = b.object_id and a.column_id = b.column_id and a.object_id = ss.object_id and a.index_id = ss2.index_id and is_included_column = 1
|
||||
) as IncludedColumns
|
||||
FROM sys.objects SS INNER JOIN sys.indexes ss2 ON ss.OBJECT_ID = ss2.OBJECT_ID
|
||||
WHERE ss.type = 'U'
|
||||
ORDER BY 1, 2, 3
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This script will find all indexes that are disabled. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/1788/disabling-indexes-in-sql-server-2005-and-sql-server-2008/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
DECLARE @is_disabled bit = 0 -- 1=disabled 0=enabled
|
||||
|
||||
SELECT
|
||||
SCHEMA_NAME(ss.SCHEMA_id) AS SchemaName,
|
||||
ss.name AS TableName,
|
||||
ss2.index_id AS IndexID,
|
||||
ss2.name AS IndexName,
|
||||
ss2.type_desc AS IndexType,
|
||||
CASE ss2.is_disabled
|
||||
WHEN 0 THEN 'Enabled'
|
||||
ELSE 'Disabled'
|
||||
END AS IndexStatus,
|
||||
ss2.fill_factor AS [FillFactor]
|
||||
FROM sys.objects SS INNER JOIN sys.indexes ss2 ON ss.OBJECT_ID = ss2.OBJECT_ID
|
||||
WHERE ss.is_ms_shipped = 0
|
||||
AND ss2.is_disabled = @is_disabled
|
||||
GO
|
||||
@@ -0,0 +1,5 @@
|
||||
SELECT a.index_id, name, avg_fragmentation_in_percent, fragment_count,
|
||||
avg_fragment_size_in_pages
|
||||
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks2017'),
|
||||
OBJECT_ID('Sales.SalesOrderDetail'), NULL, NULL, NULL) AS a
|
||||
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
|
||||
@@ -0,0 +1,27 @@
|
||||
SELECT DB_NAME(ips.database_id) AS DatabaseName,
|
||||
SCHEMA_NAME(ob.[schema_id]) SchemaNames,
|
||||
ob.[name] AS ObjectName,
|
||||
ix.[name] AS IndexName,
|
||||
ob.type_desc AS ObjectType,
|
||||
ix.type_desc AS IndexType,
|
||||
-- ips.partition_number AS PartitionNumber,
|
||||
ips.page_count AS [PageCount], -- Only Available in DETAILED Mode
|
||||
ips.record_count AS [RecordCount],
|
||||
ips.avg_fragmentation_in_percent AS AvgFragmentationInPercent
|
||||
-- FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'DETAILED') ips
|
||||
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED') ips -- QuickResult
|
||||
INNER JOIN sys.indexes ix ON ips.[object_id] = ix.[object_id]
|
||||
AND ips.index_id = ix.index_id
|
||||
INNER JOIN sys.objects ob ON ix.[object_id] = ob.[object_id]
|
||||
WHERE ob.[type] IN('U','V')
|
||||
AND ob.is_ms_shipped = 0
|
||||
AND ix.[type] IN(1,2,3,4)
|
||||
AND ix.is_disabled = 0
|
||||
AND ix.is_hypothetical = 0
|
||||
AND ips.alloc_unit_type_desc = 'IN_ROW_DATA'
|
||||
AND ips.index_level = 0
|
||||
-- AND ips.page_count >= 1000 -- Filter to check only table with over 1000 pages
|
||||
-- AND ips.record_count >= 100 -- Filter to check only table with over 1000 rows
|
||||
-- AND ips.database_id = DB_ID() -- Filter to check only current database
|
||||
-- AND ips.avg_fragmentation_in_percent > 50 -- Filter to check over 50% indexes
|
||||
ORDER BY DatabaseName
|
||||
@@ -0,0 +1,94 @@
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This script will generate create scripts for all existing indexes in a database. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/3441/script-out-all-sql-server-indexes-in-a-database-using-tsql/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
declare @SchemaName varchar(100)declare @TableName varchar(256)
|
||||
declare @IndexName varchar(256)
|
||||
declare @ColumnName varchar(100)
|
||||
declare @is_unique varchar(100)
|
||||
declare @IndexTypeDesc varchar(100)
|
||||
declare @FileGroupName varchar(100)
|
||||
declare @is_disabled varchar(100)
|
||||
declare @IndexOptions varchar(max)
|
||||
declare @IndexColumnId int
|
||||
declare @IsDescendingKey int
|
||||
declare @IsIncludedColumn int
|
||||
declare @TSQLScripCreationIndex varchar(max)
|
||||
declare @TSQLScripDisableIndex varchar(max)
|
||||
|
||||
declare CursorIndex cursor for
|
||||
select schema_name(t.schema_id) [schema_name], t.name, ix.name,
|
||||
case when ix.is_unique = 1 then 'UNIQUE ' else '' END
|
||||
, ix.type_desc,
|
||||
case when ix.is_padded=1 then 'PAD_INDEX = ON, ' else 'PAD_INDEX = OFF, ' end
|
||||
+ case when ix.allow_page_locks=1 then 'ALLOW_PAGE_LOCKS = ON, ' else 'ALLOW_PAGE_LOCKS = OFF, ' end
|
||||
+ case when ix.allow_row_locks=1 then 'ALLOW_ROW_LOCKS = ON, ' else 'ALLOW_ROW_LOCKS = OFF, ' end
|
||||
+ case when INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 then 'STATISTICS_NORECOMPUTE = ON, ' else 'STATISTICS_NORECOMPUTE = OFF, ' end
|
||||
+ case when ix.ignore_dup_key=1 then 'IGNORE_DUP_KEY = ON, ' else 'IGNORE_DUP_KEY = OFF, ' end
|
||||
+ 'SORT_IN_TEMPDB = OFF, FILLFACTOR =' + CAST(ix.fill_factor AS VARCHAR(3)) AS IndexOptions
|
||||
, ix.is_disabled , FILEGROUP_NAME(ix.data_space_id) FileGroupName
|
||||
from sys.tables t
|
||||
inner join sys.indexes ix on t.object_id=ix.object_id
|
||||
where ix.type>0 and ix.is_primary_key=0 and ix.is_unique_constraint=0 --and schema_name(tb.schema_id)= @SchemaName and tb.name=@TableName
|
||||
and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
|
||||
order by schema_name(t.schema_id), t.name, ix.name
|
||||
|
||||
open CursorIndex
|
||||
fetch next from CursorIndex into @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions,@is_disabled, @FileGroupName
|
||||
|
||||
while (@@fetch_status=0)
|
||||
begin
|
||||
declare @IndexColumns varchar(max)
|
||||
declare @IncludedColumns varchar(max)
|
||||
|
||||
set @IndexColumns=''
|
||||
set @IncludedColumns=''
|
||||
|
||||
declare CursorIndexColumn cursor for
|
||||
select col.name, ixc.is_descending_key, ixc.is_included_column
|
||||
from sys.tables tb
|
||||
inner join sys.indexes ix on tb.object_id=ix.object_id
|
||||
inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
|
||||
inner join sys.columns col on ixc.object_id =col.object_id and ixc.column_id=col.column_id
|
||||
where ix.type>0 and (ix.is_primary_key=0 or ix.is_unique_constraint=0)
|
||||
and schema_name(tb.schema_id)=@SchemaName and tb.name=@TableName and ix.name=@IndexName
|
||||
order by ixc.index_column_id
|
||||
|
||||
open CursorIndexColumn
|
||||
fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
|
||||
|
||||
while (@@fetch_status=0)
|
||||
begin
|
||||
if @IsIncludedColumn=0
|
||||
set @IndexColumns=@IndexColumns + @ColumnName + case when @IsDescendingKey=1 then ' DESC, ' else ' ASC, ' end
|
||||
else
|
||||
set @IncludedColumns=@IncludedColumns + @ColumnName +', '
|
||||
|
||||
fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
|
||||
end
|
||||
|
||||
close CursorIndexColumn
|
||||
deallocate CursorIndexColumn
|
||||
|
||||
set @IndexColumns = substring(@IndexColumns, 1, len(@IndexColumns)-1)
|
||||
set @IncludedColumns = case when len(@IncludedColumns) >0 then substring(@IncludedColumns, 1, len(@IncludedColumns)-1) else '' end
|
||||
-- print @IndexColumns
|
||||
-- print @IncludedColumns
|
||||
|
||||
set @TSQLScripCreationIndex =''
|
||||
set @TSQLScripDisableIndex =''
|
||||
set @TSQLScripCreationIndex='CREATE '+ @is_unique +@IndexTypeDesc + ' INDEX ' +QUOTENAME(@IndexName)+' ON ' + QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName)+ '('+@IndexColumns+') '+
|
||||
case when len(@IncludedColumns)>0 then CHAR(13) +'INCLUDE (' + @IncludedColumns+ ')' else '' end + CHAR(13)+'WITH (' + @IndexOptions+ ') ON ' + QUOTENAME(@FileGroupName) + ';'
|
||||
|
||||
if @is_disabled=1
|
||||
set @TSQLScripDisableIndex= CHAR(13) +'ALTER INDEX ' +QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName) + ' DISABLE;' + CHAR(13)
|
||||
|
||||
print @TSQLScripCreationIndex
|
||||
print @TSQLScripDisableIndex
|
||||
|
||||
fetch next from CursorIndex into @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions,@is_disabled, @FileGroupName
|
||||
|
||||
end
|
||||
close CursorIndex
|
||||
deallocate CursorIndex
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Find out how much SQL Server memory each index or heap is currently using. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
;WITH src
|
||||
AS (SELECT
|
||||
[Object] = o.name,
|
||||
[Type] = o.type_desc,
|
||||
[Index] = COALESCE(i.name, ''),
|
||||
[Index_Type] = i.type_desc,
|
||||
p.[object_id],
|
||||
p.index_id,
|
||||
au.allocation_unit_id
|
||||
FROM sys.partitions AS p
|
||||
INNER JOIN sys.allocation_units AS au ON p.hobt_id = au.container_id
|
||||
INNER JOIN sys.objects AS o ON p.[object_id] = o.[object_id]
|
||||
INNER JOIN sys.indexes AS i ON o.[object_id] = i.[object_id] AND p.index_id = i.index_id
|
||||
WHERE au.[type] IN (1, 2, 3)
|
||||
AND o.is_ms_shipped = 0)
|
||||
SELECT
|
||||
src.[Object],
|
||||
src.[Type],
|
||||
src.[Index],
|
||||
src.Index_Type,
|
||||
buffer_pages = COUNT_BIG(b.page_id),
|
||||
buffer_mb = COUNT_BIG(b.page_id) / 128
|
||||
FROM src
|
||||
INNER JOIN sys.dm_os_buffer_descriptors AS b ON src.allocation_unit_id = b.allocation_unit_id
|
||||
WHERE b.database_id = DB_ID()
|
||||
GROUP BY src.[Object],
|
||||
src.[Type],
|
||||
src.[Index],
|
||||
src.Index_Type
|
||||
ORDER BY buffer_pages DESC;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- Find All SQL Server Tables in Database With a Primary Key
|
||||
SELECT
|
||||
c.name as SchemaName,
|
||||
b.name as TableName,
|
||||
a.name as PKname
|
||||
FROM sys.key_constraints a
|
||||
INNER JOIN sys.tables b ON a.parent_object_id = b.OBJECT_ID
|
||||
INNER JOIN sys.schemas c ON a.schema_id = c.schema_id
|
||||
WHERE a.type = 'PK'
|
||||
|
||||
-- Find All SQL Server Tables in Database Without a Primary Key
|
||||
|
||||
SELECT
|
||||
c.name as SchemaName,
|
||||
b.name as TableName
|
||||
FROM sys.tables b
|
||||
INNER JOIN sys.schemas c ON b.schema_id = c.schema_id
|
||||
WHERE b.type = 'U'
|
||||
AND NOT EXISTS (SELECT a.name
|
||||
FROM sys.key_constraints a
|
||||
WHERE a.parent_object_id = b.OBJECT_ID
|
||||
AND a.schema_id = c.schema_id
|
||||
AND a.type = 'PK' )
|
||||
@@ -0,0 +1,5 @@
|
||||
SELECT DB_NAME(database_id) AS database_name,
|
||||
OBJECT_NAME(s.object_id) AS object_name, i.name, s.*
|
||||
FROM sys.dm_db_index_usage_stats s JOIN sys.indexes i
|
||||
ON s.object_id = i.object_id AND s.index_id = i.index_id
|
||||
--AND OBJECT_ID('dbo.SalesOrderDetail') = s.object_id
|
||||
@@ -0,0 +1,50 @@
|
||||
DECLARE @Database NVARCHAR(255)
|
||||
DECLARE @Table NVARCHAR(255)
|
||||
DECLARE @cmd NVARCHAR(1000)
|
||||
|
||||
DECLARE DatabaseCursor CURSOR READ_ONLY FOR
|
||||
SELECT name FROM master.sys.databases
|
||||
WHERE name NOT IN ('master','msdb','tempdb','model','distribution') -- databases to exclude
|
||||
--WHERE name IN ('DB1', 'DB2') -- use this to select specific databases and comment out line above
|
||||
AND state = 0 -- database is online
|
||||
AND is_in_standby = 0 -- database is not read only for log shipping
|
||||
ORDER BY 1
|
||||
|
||||
OPEN DatabaseCursor
|
||||
|
||||
FETCH NEXT FROM DatabaseCursor INTO @Database
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
|
||||
SET @cmd = 'DECLARE TableCursor CURSOR READ_ONLY FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
|
||||
table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''
|
||||
|
||||
-- create table cursor
|
||||
EXEC (@cmd)
|
||||
OPEN TableCursor
|
||||
|
||||
FETCH NEXT FROM TableCursor INTO @Table
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
BEGIN TRY
|
||||
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD'
|
||||
--PRINT @cmd -- uncomment if you want to see commands
|
||||
EXEC (@cmd)
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
PRINT '---'
|
||||
PRINT @cmd
|
||||
PRINT ERROR_MESSAGE()
|
||||
PRINT '---'
|
||||
END CATCH
|
||||
|
||||
FETCH NEXT FROM TableCursor INTO @Table
|
||||
END
|
||||
|
||||
CLOSE TableCursor
|
||||
DEALLOCATE TableCursor
|
||||
|
||||
FETCH NEXT FROM DatabaseCursor INTO @Database
|
||||
END
|
||||
CLOSE DatabaseCursor
|
||||
DEALLOCATE DatabaseCursor
|
||||
@@ -0,0 +1,50 @@
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This query will find indexes with duplicate columns. Run this in the user database.
|
||||
-- More Information: https://www.mssqltips.com/sqlservertip/3604/identify-sql-server-indexes-with-duplicate-columns/
|
||||
-- Revision: 2019-05-21
|
||||
--
|
||||
SELECT t1.tablename, t1.indexname ,t1.columnlist, t2.indexname, t2.columnlist
|
||||
FROM
|
||||
(SELECT
|
||||
DISTINCT object_name(i.object_id) tablename,
|
||||
i.name indexname,
|
||||
(SELECT DISTINCT STUFF( (SELECT ', ' + c.name
|
||||
FROM sys.index_columns ic1
|
||||
INNER JOIN sys.columns c ON ic1.object_id=c.object_id AND ic1.column_id=c.column_id
|
||||
WHERE
|
||||
ic1.index_id = ic.index_id
|
||||
AND ic1.object_id=i.object_id
|
||||
AND ic1.index_id=i.index_id
|
||||
ORDER BY index_column_id FOR XML PATH('')
|
||||
),1,2,'')
|
||||
FROM sys.index_columns ic
|
||||
WHERE object_id=i.object_id AND index_id=i.index_id
|
||||
) as columnlist
|
||||
FROM sys.indexes i
|
||||
INNER JOIN sys.index_columns ic ON i.object_id=ic.object_id AND i.index_id=ic.index_id
|
||||
INNER JOIN sys.objects o ON i.object_id=o.object_id
|
||||
WHERE o.is_ms_shipped=0) t1
|
||||
INNER JOIN
|
||||
(SELECT
|
||||
DISTINCT object_name(i.object_id) tablename,
|
||||
i.name indexname,
|
||||
(SELECT DISTINCT STUFF( (SELECT ', ' + c.name
|
||||
FROM sys.index_columns ic1
|
||||
INNER JOIN sys.columns c ON ic1.object_id=c.object_id AND ic1.column_id=c.column_id
|
||||
WHERE
|
||||
ic1.index_id = ic.index_id
|
||||
AND ic1.object_id=i.object_id
|
||||
AND ic1.index_id=i.index_id
|
||||
ORDER BY index_column_id FOR XML PATH('')
|
||||
),1,2,'')
|
||||
FROM sys.index_columns ic
|
||||
WHERE object_id=i.object_id AND index_id=i.index_id
|
||||
) as columnlist
|
||||
FROM sys.indexes i
|
||||
INNER JOIN sys.index_columns ic ON i.object_id=ic.object_id AND i.index_id=ic.index_id
|
||||
INNER JOIN sys.objects o ON i.object_id=o.object_id
|
||||
WHERE o.is_ms_shipped=0) t2
|
||||
ON t1.tablename=t2.tablename
|
||||
AND substring(t2.columnlist,1,len(t1.columnlist))=t1.columnlist
|
||||
AND (t1.columnlist<>t2.columnlist or (t1.columnlist=t2.columnlist AND t1.indexname<>t2.indexname))
|
||||
@@ -0,0 +1,71 @@
|
||||
create table #SVer(ID int, Name sysname, Internal_Value int, Value nvarchar(512)) insert #SVer exec master.dbo.xp_msver
|
||||
declare @SmoRoot nvarchar(512)
|
||||
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT
|
||||
|
||||
--insert into InstanceList
|
||||
SELECT
|
||||
serverproperty(N'ComputerNamePhysicalNetBIOS') AS [Host_name],
|
||||
serverproperty(N'ServerName') as [ServerName],
|
||||
serverproperty(N'InstanceName') as [InstanceName],
|
||||
GETDATE() as date_invent,
|
||||
(select Value from #SVer where Name = N'ProductName') AS [Product],
|
||||
SERVERPROPERTY(N'ProductVersion') AS [VersionString],
|
||||
(select Value from #SVer where Name = N'Language') AS [Language],
|
||||
(select Value from #SVer where Name = N'Platform') AS [Platform],
|
||||
CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition],
|
||||
(select Internal_Value from #SVer where Name = N'ProcessorCount') AS [Processors],
|
||||
(select Value from #SVer where Name = N'WindowsVersion') AS [OSVersion],
|
||||
(select Internal_Value from #SVer where Name = N'PhysicalMemory') AS [PhysicalMemory],
|
||||
cast(SERVERPROPERTY('IsClustered') AS varchar) AS [IsClustered],
|
||||
@SmoRoot AS [RootDirectory],
|
||||
convert(sysname, serverproperty(N'collation')) AS [Collation]
|
||||
|
||||
drop table #SVer
|
||||
|
||||
SELECT
|
||||
serverproperty(N'ComputerNamePhysicalNetBIOS') AS [Host_name],
|
||||
GETDATE() as date_invent,
|
||||
dtb.name AS [Database_Name],
|
||||
|
||||
case
|
||||
when DATABASEPROPERTY(dtb.name,'IsShutDown') is null then 0x200
|
||||
else 0
|
||||
end |
|
||||
case
|
||||
when 1 = dtb.is_in_standby then 0x40
|
||||
else 0
|
||||
end |
|
||||
case
|
||||
when 1 = dtb.is_cleanly_shutdown then 0x80
|
||||
else 0
|
||||
end |
|
||||
case dtb.state
|
||||
when 1 then 0x2
|
||||
when 2 then 0x8
|
||||
when 3 then 0x4
|
||||
when 4 then 0x10
|
||||
when 5 then 0x100
|
||||
when 6 then 0x20
|
||||
else 1
|
||||
end
|
||||
AS [Database_Status_int],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'Status')) as Database_status,
|
||||
create_date,
|
||||
dtb.compatibility_level AS [Database_CompatibilityLevel],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'Recovery')) AS [RecoveryModel],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'UserAccess')) AS [UserAccess],
|
||||
convert(sysname,DatabasePropertyEx(dtb.name,'Updateability')) AS [ReadOnly]
|
||||
FROM
|
||||
master.sys.databases AS dtb
|
||||
LEFT OUTER JOIN sys.database_mirroring AS dmi ON dmi.database_id = dtb.database_id
|
||||
|
||||
WHERE
|
||||
(CAST(case when dtb.name in ('master','model','msdb','tempdb','IBM') then 1 else dtb.is_distributor end AS bit)=0 and CAST(isnull(dtb.source_database_id, 0) AS bit)=0)
|
||||
ORDER BY
|
||||
[Database_Name] ASC
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
CREATE TABLE #CPUValues(
|
||||
[index] SMALLINT,
|
||||
[description] VARCHAR(128),
|
||||
[server_cores] SMALLINT,
|
||||
[value] VARCHAR(5)
|
||||
)
|
||||
|
||||
CREATE TABLE #MemoryValues(
|
||||
[index] SMALLINT,
|
||||
[description] VARCHAR(128),
|
||||
[server_memory] DECIMAL(10,2),
|
||||
[value] VARCHAR(64)
|
||||
)
|
||||
|
||||
INSERT INTO #CPUValues
|
||||
EXEC xp_msver 'ProcessorCount'
|
||||
|
||||
INSERT INTO #MemoryValues
|
||||
EXEC xp_msver 'PhysicalMemory'
|
||||
|
||||
SELECT
|
||||
SERVERPROPERTY('SERVERNAME') AS 'instance',
|
||||
v.sql_version,
|
||||
(SELECT SUBSTRING(CONVERT(VARCHAR(255),SERVERPROPERTY('EDITION')),0,CHARINDEX('Edition',CONVERT(VARCHAR(255),SERVERPROPERTY('EDITION')))) + 'Edition') AS sql_edition,
|
||||
SERVERPROPERTY('ProductLevel') AS 'service_pack_level',
|
||||
SERVERPROPERTY('ProductVersion') AS 'build_number',
|
||||
(SELECT DISTINCT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID) AS [port],
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%min server memory%') AS min_server_memory,
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%max server memory%') AS max_server_memory,
|
||||
(SELECT ROUND(CONVERT(DECIMAL(10,2),server_memory/1024.0),1) FROM #MemoryValues) AS server_memory,
|
||||
server_cores,
|
||||
(SELECT COUNT(*) AS 'sql_cores' FROM sys.dm_os_schedulers WHERE status = 'VISIBLE ONLINE') AS sql_cores,
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%degree of parallelism%') AS max_dop,
|
||||
(SELECT [value] FROM sys.configurations WHERE name like '%cost threshold for parallelism%') AS cost_threshold_for_parallelism
|
||||
FROM #CPUValues
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
CASE
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '8%' THEN 'SQL Server 2000'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '9%' THEN 'SQL Server 2005'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '10.0%' THEN 'SQL Server 2008'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '10.5%' THEN 'SQL Server 2008 R2'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '11%' THEN 'SQL Server 2012'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '12%' THEN 'SQL Server 2014'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '13%' THEN 'SQL Server 2016'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '14%' THEN 'SQL Server 2017'
|
||||
WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('PRODUCTVERSION')) like '15%' THEN 'SQL Server 2019'
|
||||
ELSE 'UNKNOWN'
|
||||
END AS sql_version
|
||||
) AS v ON 1 = 1
|
||||
|
||||
DROP TABLE #CPUValues
|
||||
DROP TABLE #MemoryValues
|
||||
@@ -0,0 +1,574 @@
|
||||
-- SQL Server Error Log Scripts
|
||||
-- Last script revision - 2019-07-02
|
||||
--
|
||||
-- Scripts provided by MSSQLTips.com are from various contributors. Use links below to learn more about the scripts.
|
||||
--
|
||||
-- Be careful using any of these scripts. Test all scripts in Test/Dev prior to using in Production environments.
|
||||
-- Please refer to the disclaimer policy: https://www.mssqltips.com/disclaimer/
|
||||
-- Please refer to the copyright policy: https://www.mssqltips.com/copyright/
|
||||
--
|
||||
-- Note, these scripts are meant to be run individually.
|
||||
--
|
||||
-- Have a script to contribute or an update? Send an email to: tips@mssqltips.com
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: This shows any errors in the SQL Server error log along with all associated error lines.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1307/simple-way-to-find-errors-in-sql-server-error-log/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE master
|
||||
GO
|
||||
DROP TABLE IF EXISTS #errorLog; -- this is new syntax in SQL 2016 and later
|
||||
--IF OBJECT_ID('tempdb..#errorLog') IS NOT NULL DROP TABLE #errorLog -- this is old syntax prior to SQL 2016
|
||||
|
||||
CREATE TABLE #errorLog (LogDate DATETIME, ProcessInfo VARCHAR(64), [Text] VARCHAR(MAX));
|
||||
|
||||
INSERT INTO #errorLog
|
||||
EXEC sp_readerrorlog 0 -- specify the log number or use nothing for active error log
|
||||
|
||||
SELECT *
|
||||
FROM #errorLog a
|
||||
WHERE EXISTS (SELECT *
|
||||
FROM #errorLog b
|
||||
WHERE [Text] like 'Error:%'
|
||||
AND a.LogDate = b.LogDate
|
||||
AND a.ProcessInfo = b.ProcessInfo)
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Identify location of where the SQL Server Error Log file is written
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/2506/identify-location-of-the-sql-server-error-log-file/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE master
|
||||
GO
|
||||
xp_readerrorlog 0, 1, N'Logging SQL Server messages in file'
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Stop logging all successful database backpus in the SQL Server Error Log
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1307/simple-way-to-find-errors-in-sql-server-error-log/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
-- this will temporarily stop logging all successful backup entries to the SQL Server error log
|
||||
-- but this will revert if SQL Server is restarted, so you need to set this trace flag as a startup parameter
|
||||
-- see https://www.mssqltips.com/sqlservertip/960/setting-sql-server-startup-parameters/
|
||||
--
|
||||
USE master
|
||||
GO
|
||||
DBCC TRACEON (3226,-1)
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Create new SQL Server Error Log. This will archive the current error log and create a new empty log.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1155/sql-server-error-log-management/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
EXEC master.sys.sp_cycle_errorlog;
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Logging all logins to SQL Server can eat up a lot of space in the error log. This will change the setting so that
|
||||
-- only failed logins are logged to the SQL Server error log, so you can still audit these.
|
||||
-- More information:
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE [master]
|
||||
GO
|
||||
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel', REG_DWORD, 2
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Increase the number of SQL Server Error Logs from the default of 7. This will increase from 7 to 30.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/1155/sql-server-error-log-management/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
USE [master]
|
||||
GO
|
||||
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 30
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Search for text in all SQL Server Error Logs
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/5613/sql-server-script-to-search-through-all-error-logs/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
DECLARE @LogType INT = 1
|
||||
DECLARE @filterstr NVARCHAR (4000) = 'checkdb' -- change this value for keyword to search
|
||||
|
||||
BEGIN
|
||||
-- The list of all logs table
|
||||
DECLARE @LogList TABLE (LogNumber INT, StartDate DATETIME, SizeInBytes INT)
|
||||
-- All the log rows results table
|
||||
DECLARE @ALLLogRows TABLE (LogDate DATETIME,
|
||||
ProcessInfo NVARCHAR (4000),
|
||||
Test NVARCHAR (4000))
|
||||
|
||||
-- Store in a table variable
|
||||
INSERT INTO @LogList
|
||||
EXEC xp_enumerrorlogs @LogType
|
||||
|
||||
-- Iterate on all the logs and collect all log rows
|
||||
DECLARE @idx INT = 0
|
||||
WHILE @idx <= (SELECT MAX (LogNumber) FROM @LogList)
|
||||
BEGIN
|
||||
INSERT INTO @ALLLogRows
|
||||
EXEC xp_readerrorlog @idx -- Log number
|
||||
, @LogType -- 1=SQL Server log, 2=SQL Agent log
|
||||
, @filterstr -- filter string
|
||||
, @filterstr
|
||||
|
||||
SET @idx += 1
|
||||
END
|
||||
-- Return the results from the log rows table variable
|
||||
SELECT *
|
||||
FROM @ALLLogRows
|
||||
ORDER BY LogDate DESC
|
||||
END
|
||||
GO
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
-- Purpose: Read through SQL Server Error Log and current default trace file and extract errors and warning.
|
||||
-- More information: https://www.mssqltips.com/sqlservertip/5140/read-all-errors-and-warnings-in-the-sql-server-error-log-for-all-versions/
|
||||
-- Revision: 2019-07-02
|
||||
--
|
||||
-- Load setup
|
||||
CREATE TABLE #ExclusionList ([StringValue] VARCHAR(8000))
|
||||
CREATE TABLE #ObjectTypeName ([ObjectType] INT, [ObjectName] VARCHAR(100))
|
||||
CREATE TABLE #TraceEvents ([Trace_Event_Id] SMALLINT, [Category_Id] SMALLINT, [Name] VARCHAR(128))
|
||||
INSERT INTO #ExclusionList VALUES ('Microsoft Corp')
|
||||
INSERT INTO #ExclusionList VALUES ('Microsoft SQL Server')
|
||||
INSERT INTO #ExclusionList VALUES ('UTC adjust')
|
||||
INSERT INTO #ExclusionList VALUES ('All rights reserved')
|
||||
INSERT INTO #ExclusionList VALUES ('Server name is')
|
||||
INSERT INTO #ExclusionList VALUES ('Server process ID is')
|
||||
INSERT INTO #ExclusionList VALUES ('System Manufact')
|
||||
INSERT INTO #ExclusionList VALUES ('Authentication mode is')
|
||||
INSERT INTO #ExclusionList VALUES ('Logging SQL Server messages in')
|
||||
INSERT INTO #ExclusionList VALUES ('This is an informational message')
|
||||
INSERT INTO #ExclusionList VALUES ('Registry startup parameters')
|
||||
INSERT INTO #ExclusionList VALUES ('Command Line Startup Parameters')
|
||||
INSERT INTO #ExclusionList VALUES ('Using conventional memory in')
|
||||
INSERT INTO #ExclusionList VALUES ('Default collation')
|
||||
INSERT INTO #ExclusionList VALUES ('Query Store settings initialized with')
|
||||
INSERT INTO #ExclusionList VALUES ('The maximum number of dedicated administrator connections for this instance is')
|
||||
INSERT INTO #ExclusionList VALUES ('Starting up database')
|
||||
INSERT INTO #ExclusionList VALUES ('CLR version')
|
||||
INSERT INTO #ExclusionList VALUES ('Using %.dll'' version')
|
||||
INSERT INTO #ExclusionList VALUES ('Software Usage Metrics is')
|
||||
INSERT INTO #ExclusionList VALUES ('Common Language runtime (CLR) functionality initialized using')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Trace ID % was started by')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Trace stopped')
|
||||
INSERT INTO #ExclusionList VALUES ('A self-generated certificate was successfully loaded')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL server listening on')
|
||||
INSERT INTO #ExclusionList VALUES ('Server is listening on')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Server is ready for client connection')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Server is starting at priority class')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL Server configured for thread mode processing')
|
||||
INSERT INTO #ExclusionList VALUES ('SQL global counter collection task is created')
|
||||
INSERT INTO #ExclusionList VALUES ('Large Page Extensions enabled')
|
||||
INSERT INTO #ExclusionList VALUES ('Server local connection provider is ready to accept connection on')
|
||||
INSERT INTO #ExclusionList VALUES ('Server named pipe provider is ready to accept connection on')
|
||||
INSERT INTO #ExclusionList VALUES ('Recovery complete')
|
||||
INSERT INTO #ExclusionList VALUES ('Dedicated admin connection support was established for listening')
|
||||
INSERT INTO #ExclusionList VALUES ('A new instance of the full-text filter daemon host process')
|
||||
INSERT INTO #ExclusionList VALUES ('Clearing tempdb database')
|
||||
INSERT INTO #ExclusionList VALUES ('No user action is required')
|
||||
INSERT INTO #ExclusionList VALUES ('due to some database maintenance or reconfigure operations')
|
||||
INSERT INTO #ExclusionList VALUES ('The error log has been reinitialized')
|
||||
INSERT INTO #ExclusionList VALUES ('Service Broker manager has')
|
||||
INSERT INTO #ExclusionList VALUES ('FlushCache: cleaned up % bufs with % writes in % ms')
|
||||
INSERT INTO #ExclusionList VALUES ('average throughput: % MB/sec, I/O saturation: %, context switches')
|
||||
INSERT INTO #ExclusionList VALUES ('last target outstanding: %, avgWriteLatency')
|
||||
INSERT INTO #ExclusionList VALUES ('cachestore flush % due to ''DBCC FREEPROCCACHE'' or ''DBCC FREESYSTEMCACHE''')
|
||||
INSERT INTO #ExclusionList VALUES ('Using locked pages for buffer pool')
|
||||
INSERT INTO #ExclusionList VALUES ('Resource governor reconfiguration succeeded')
|
||||
INSERT INTO #ExclusionList VALUES ('FILESTREAM: % file system access share name =')
|
||||
INSERT INTO #ExclusionList VALUES ('The % protocol transport is now listening for connections')
|
||||
INSERT INTO #ExclusionList VALUES ('The % protocol transport is disabled or not configured')
|
||||
INSERT INTO #ExclusionList VALUES ('The % endpoint is in disabled or stopped state')
|
||||
INSERT INTO #ExclusionList VALUES ('Database mirroring has been enabled on this instance of SQL Server')
|
||||
INSERT INTO #ExclusionList VALUES ('Database %: IO is frozen for snapsho')
|
||||
INSERT INTO #ExclusionList VALUES ('Database %: IO is thawe')
|
||||
INSERT INTO #ExclusionList VALUES ('Setting database option COMPATIBILITY_LEVEL to')
|
||||
INSERT INTO #ExclusionList VALUES ('The activated proc % running on queue % output the following')
|
||||
INSERT INTO #ExclusionList VALUES ('Database Audit Backup/Restore Event')
|
||||
INSERT INTO #ExclusionList VALUES ('User-Defined Table Created')
|
||||
INSERT INTO #ExclusionList VALUES ('Index Created')
|
||||
INSERT INTO #ExclusionList VALUES ('Server Audit Server Alter Trace Event')
|
||||
INSERT INTO #ExclusionList VALUES ('Creating member security items for % started at')
|
||||
-- Exclude log shipping database events
|
||||
IF @@VERSION LIKE 'Microsoft SQL Server 2000%'
|
||||
BEGIN
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option SINGLE_USER to ON for database '+[secondary_database_name] FROM [msdb].[dbo].[log_shipping_secondaries]
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option MULTI_USER to ON for database '+[secondary_database_name] FROM [msdb].[dbo].[log_shipping_secondaries]
|
||||
INSERT INTO #ExclusionList SELECT 'The database '''+[secondary_database_name]+''' is marked RESTORING' FROM [msdb].[dbo].[log_shipping_secondaries]
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option SINGLE_USER to ON for database '+[secondary_database] FROM [msdb].[dbo].[log_shipping_secondary_databases]
|
||||
INSERT INTO #ExclusionList SELECT 'Setting database option MULTI_USER to ON for database '+[secondary_database] FROM [msdb].[dbo].[log_shipping_secondary_databases]
|
||||
INSERT INTO #ExclusionList SELECT 'The database '''+[secondary_database]+''' is marked RESTORING' FROM [msdb].[dbo].[log_shipping_secondary_databases]
|
||||
END
|
||||
-- Setup configuration tables
|
||||
INSERT INTO #ObjectTypeName VALUES (1,'Index');
|
||||
INSERT INTO #ObjectTypeName VALUES (2,'Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (3,'User Object');
|
||||
INSERT INTO #ObjectTypeName VALUES (4,'Check Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (5,'Default Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (6,'Foreign Key Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (7,'Primary Key Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (8,'Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (9,'User-Defined Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (10,'Rule');
|
||||
INSERT INTO #ObjectTypeName VALUES (11,'Replication Filter Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (12,'System Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (13,'Trigger');
|
||||
INSERT INTO #ObjectTypeName VALUES (14,'Inline Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (15,'Table Valued UDF');
|
||||
INSERT INTO #ObjectTypeName VALUES (16,'Unique Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (17,'User Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (18,'View');
|
||||
INSERT INTO #ObjectTypeName VALUES (19,'Extended Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (20,'Ad hoc Query');
|
||||
INSERT INTO #ObjectTypeName VALUES (21,'Prepared Query');
|
||||
INSERT INTO #ObjectTypeName VALUES (8259,'Check Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (8260,'Default Constraint/Standalone');
|
||||
INSERT INTO #ObjectTypeName VALUES (8262,'Foreign-Key Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (8272,'Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (8274,'Rule');
|
||||
INSERT INTO #ObjectTypeName VALUES (8275,'System Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (8276,'Trigger on Server');
|
||||
INSERT INTO #ObjectTypeName VALUES (8277,'User-Defined Table');
|
||||
INSERT INTO #ObjectTypeName VALUES (8278,'View');
|
||||
INSERT INTO #ObjectTypeName VALUES (8280,'Extended Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (16724,'CLR Trigger');
|
||||
INSERT INTO #ObjectTypeName VALUES (16964,'Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (16975,'Object');
|
||||
INSERT INTO #ObjectTypeName VALUES (17222,'FullText Catalog');
|
||||
INSERT INTO #ObjectTypeName VALUES (17232,'CLR Stored Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (17235,'Schema');
|
||||
INSERT INTO #ObjectTypeName VALUES (17475,'Credential');
|
||||
INSERT INTO #ObjectTypeName VALUES (17491,'DDL Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17741,'Management Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17747,'Security Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17749,'User Event');
|
||||
INSERT INTO #ObjectTypeName VALUES (17985,'CLR Aggregate Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (17993,'Inline Table-Valued SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (18000,'Partition Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (18002,'Replication Filter Procedure');
|
||||
INSERT INTO #ObjectTypeName VALUES (18004,'Table-Valued SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (18259,'Server Role');
|
||||
INSERT INTO #ObjectTypeName VALUES (18263,'Microsoft Windows Group');
|
||||
INSERT INTO #ObjectTypeName VALUES (19265,'Asymmetric Key');
|
||||
INSERT INTO #ObjectTypeName VALUES (19277,'Master Key');
|
||||
INSERT INTO #ObjectTypeName VALUES (19280,'Primary Key');
|
||||
INSERT INTO #ObjectTypeName VALUES (19283,'ObfusKey');
|
||||
INSERT INTO #ObjectTypeName VALUES (19521,'Asymmetric Key Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (19523,'Certificate Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (19538,'Role');
|
||||
INSERT INTO #ObjectTypeName VALUES (19539,'SQL Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (19543,'Windows Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (20034,'Remote Service Binding');
|
||||
INSERT INTO #ObjectTypeName VALUES (20036,'Event Notification on Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (20037,'Event Notification');
|
||||
INSERT INTO #ObjectTypeName VALUES (20038,'Scalar SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (20047,'Event Notification on Object');
|
||||
INSERT INTO #ObjectTypeName VALUES (20051,'Synonym');
|
||||
INSERT INTO #ObjectTypeName VALUES (20549,'End Point');
|
||||
INSERT INTO #ObjectTypeName VALUES (20801,'Adhoc Queries which may be cached');
|
||||
INSERT INTO #ObjectTypeName VALUES (20816,'Prepared Queries which may be cached');
|
||||
INSERT INTO #ObjectTypeName VALUES (20819,'Service Broker Service Queue');
|
||||
INSERT INTO #ObjectTypeName VALUES (20821,'Unique Constraint');
|
||||
INSERT INTO #ObjectTypeName VALUES (21057,'Application Role');
|
||||
INSERT INTO #ObjectTypeName VALUES (21059,'Certificate');
|
||||
INSERT INTO #ObjectTypeName VALUES (21075,'Server');
|
||||
INSERT INTO #ObjectTypeName VALUES (21076,'Transact-SQL Trigger');
|
||||
INSERT INTO #ObjectTypeName VALUES (21313,'Assembly');
|
||||
INSERT INTO #ObjectTypeName VALUES (21318,'CLR Scalar Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (21321,'Inline scalar SQL Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (21328,'Partition Scheme');
|
||||
INSERT INTO #ObjectTypeName VALUES (21333,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21571,'Service Broker Service Contract');
|
||||
INSERT INTO #ObjectTypeName VALUES (21572,'Trigger on Database');
|
||||
INSERT INTO #ObjectTypeName VALUES (21574,'CLR Table-valued Function');
|
||||
INSERT INTO #ObjectTypeName VALUES (21577,'Internal Table (XML Node/Queue)');
|
||||
INSERT INTO #ObjectTypeName VALUES (21581,'Service Broker Message Type');
|
||||
INSERT INTO #ObjectTypeName VALUES (21586,'Service Broker Route');
|
||||
INSERT INTO #ObjectTypeName VALUES (21587,'Statistics');
|
||||
INSERT INTO #ObjectTypeName VALUES (21825,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21827,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21831,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21843,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (21847,'User');
|
||||
INSERT INTO #ObjectTypeName VALUES (22099,'Service Broker Service');
|
||||
INSERT INTO #ObjectTypeName VALUES (22601,'Index');
|
||||
INSERT INTO #ObjectTypeName VALUES (22604,'Certificate Login');
|
||||
INSERT INTO #ObjectTypeName VALUES (22611,'XMLSchema');
|
||||
INSERT INTO #ObjectTypeName VALUES (22868,'Type');
|
||||
INSERT INTO #TraceEvents VALUES (10,11,'RPC:Completed');
|
||||
INSERT INTO #TraceEvents VALUES (11,11,'RPC:Starting');
|
||||
INSERT INTO #TraceEvents VALUES (12,13,'SQL:BatchCompleted');
|
||||
INSERT INTO #TraceEvents VALUES (13,13,'SQL:BatchStarting');
|
||||
INSERT INTO #TraceEvents VALUES (14,8,'Audit Login');
|
||||
INSERT INTO #TraceEvents VALUES (15,8,'Audit Logout');
|
||||
INSERT INTO #TraceEvents VALUES (16,3,'Attention');
|
||||
INSERT INTO #TraceEvents VALUES (17,10,'ExistingConnection');
|
||||
INSERT INTO #TraceEvents VALUES (18,8,'Audit Server Starts And Stops');
|
||||
INSERT INTO #TraceEvents VALUES (19,12,'DTCTransaction');
|
||||
INSERT INTO #TraceEvents VALUES (20,8,'Audit Login Failed');
|
||||
INSERT INTO #TraceEvents VALUES (21,3,'EventLog');
|
||||
INSERT INTO #TraceEvents VALUES (22,3,'ErrorLog');
|
||||
INSERT INTO #TraceEvents VALUES (23,4,'Lock:Released');
|
||||
INSERT INTO #TraceEvents VALUES (24,4,'Lock:Acquired');
|
||||
INSERT INTO #TraceEvents VALUES (25,4,'Lock:Deadlock');
|
||||
INSERT INTO #TraceEvents VALUES (26,4,'Lock:Cancel');
|
||||
INSERT INTO #TraceEvents VALUES (27,4,'Lock:Timeout');
|
||||
INSERT INTO #TraceEvents VALUES (28,6,'Degree of Parallelism');
|
||||
INSERT INTO #TraceEvents VALUES (33,3,'Exception');
|
||||
INSERT INTO #TraceEvents VALUES (34,11,'SP:CacheMiss');
|
||||
INSERT INTO #TraceEvents VALUES (35,11,'SP:CacheInsert');
|
||||
INSERT INTO #TraceEvents VALUES (36,11,'SP:CacheRemove');
|
||||
INSERT INTO #TraceEvents VALUES (37,11,'SP:Recompile');
|
||||
INSERT INTO #TraceEvents VALUES (38,11,'SP:CacheHit');
|
||||
INSERT INTO #TraceEvents VALUES (40,13,'SQL:StmtStarting');
|
||||
INSERT INTO #TraceEvents VALUES (41,13,'SQL:StmtCompleted');
|
||||
INSERT INTO #TraceEvents VALUES (42,11,'SP:Starting');
|
||||
INSERT INTO #TraceEvents VALUES (43,11,'SP:Completed');
|
||||
INSERT INTO #TraceEvents VALUES (44,11,'SP:StmtStarting');
|
||||
INSERT INTO #TraceEvents VALUES (45,11,'SP:StmtCompleted');
|
||||
INSERT INTO #TraceEvents VALUES (46,5,'Object:Created');
|
||||
INSERT INTO #TraceEvents VALUES (47,5,'Object:Deleted');
|
||||
INSERT INTO #TraceEvents VALUES (50,12,'SQLTransaction');
|
||||
INSERT INTO #TraceEvents VALUES (51,7,'Scan:Started');
|
||||
INSERT INTO #TraceEvents VALUES (52,7,'Scan:Stopped');
|
||||
INSERT INTO #TraceEvents VALUES (53,1,'CursorOpen');
|
||||
INSERT INTO #TraceEvents VALUES (54,12,'TransactionLog');
|
||||
INSERT INTO #TraceEvents VALUES (55,3,'Hash Warning');
|
||||
INSERT INTO #TraceEvents VALUES (58,6,'Auto Stats');
|
||||
INSERT INTO #TraceEvents VALUES (59,4,'Lock:Deadlock Chain');
|
||||
INSERT INTO #TraceEvents VALUES (60,4,'Lock:Escalation');
|
||||
INSERT INTO #TraceEvents VALUES (61,15,'OLEDB Errors');
|
||||
INSERT INTO #TraceEvents VALUES (67,3,'Execution Warnings');
|
||||
INSERT INTO #TraceEvents VALUES (68,6,'Showplan Text (Unencoded)');
|
||||
INSERT INTO #TraceEvents VALUES (69,3,'Sort Warnings');
|
||||
INSERT INTO #TraceEvents VALUES (70,1,'CursorPrepare');
|
||||
INSERT INTO #TraceEvents VALUES (71,13,'Prepare SQL');
|
||||
INSERT INTO #TraceEvents VALUES (72,13,'Exec Prepared SQL');
|
||||
INSERT INTO #TraceEvents VALUES (73,13,'Unprepare SQL');
|
||||
INSERT INTO #TraceEvents VALUES (74,1,'CursorExecute');
|
||||
INSERT INTO #TraceEvents VALUES (75,1,'CursorRecompile');
|
||||
INSERT INTO #TraceEvents VALUES (76,1,'CursorImplicitConversion');
|
||||
INSERT INTO #TraceEvents VALUES (77,1,'CursorUnprepare');
|
||||
INSERT INTO #TraceEvents VALUES (78,1,'CursorClose');
|
||||
INSERT INTO #TraceEvents VALUES (79,3,'Missing Column Statistics');
|
||||
INSERT INTO #TraceEvents VALUES (80,3,'Missing Join Predicate');
|
||||
INSERT INTO #TraceEvents VALUES (81,9,'Server Memory Change');
|
||||
INSERT INTO #TraceEvents VALUES (82,14,'UserConfigurable:0');
|
||||
INSERT INTO #TraceEvents VALUES (83,14,'UserConfigurable:1');
|
||||
INSERT INTO #TraceEvents VALUES (84,14,'UserConfigurable:2');
|
||||
INSERT INTO #TraceEvents VALUES (85,14,'UserConfigurable:3');
|
||||
INSERT INTO #TraceEvents VALUES (86,14,'UserConfigurable:4');
|
||||
INSERT INTO #TraceEvents VALUES (87,14,'UserConfigurable:5');
|
||||
INSERT INTO #TraceEvents VALUES (88,14,'UserConfigurable:6');
|
||||
INSERT INTO #TraceEvents VALUES (89,14,'UserConfigurable:7');
|
||||
INSERT INTO #TraceEvents VALUES (90,14,'UserConfigurable:8');
|
||||
INSERT INTO #TraceEvents VALUES (91,14,'UserConfigurable:9');
|
||||
INSERT INTO #TraceEvents VALUES (92,2,'Data File Auto Grow');
|
||||
INSERT INTO #TraceEvents VALUES (93,2,'Log File Auto Grow');
|
||||
INSERT INTO #TraceEvents VALUES (94,2,'Data File Auto Shrink');
|
||||
INSERT INTO #TraceEvents VALUES (95,2,'Log File Auto Shrink');
|
||||
INSERT INTO #TraceEvents VALUES (96,6,'Showplan Text');
|
||||
INSERT INTO #TraceEvents VALUES (97,6,'Showplan All');
|
||||
INSERT INTO #TraceEvents VALUES (98,6,'Showplan Statistics Profile');
|
||||
INSERT INTO #TraceEvents VALUES (100,11,'RPC Output Parameter');
|
||||
INSERT INTO #TraceEvents VALUES (102,8,'Audit Database Scope GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (103,8,'Audit Schema Object GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (104,8,'Audit Addlogin Event');
|
||||
INSERT INTO #TraceEvents VALUES (105,8,'Audit Login GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (106,8,'Audit Login Change Property Event');
|
||||
INSERT INTO #TraceEvents VALUES (107,8,'Audit Login Change Password Event');
|
||||
INSERT INTO #TraceEvents VALUES (108,8,'Audit Add Login to Server Role Event');
|
||||
INSERT INTO #TraceEvents VALUES (109,8,'Audit Add DB User Event');
|
||||
INSERT INTO #TraceEvents VALUES (110,8,'Audit Add Member to DB Role Event');
|
||||
INSERT INTO #TraceEvents VALUES (111,8,'Audit Add Role Event');
|
||||
INSERT INTO #TraceEvents VALUES (112,8,'Audit App Role Change Password Event');
|
||||
INSERT INTO #TraceEvents VALUES (113,8,'Audit Statement Permission Event');
|
||||
INSERT INTO #TraceEvents VALUES (114,8,'Audit Schema Object Access Event');
|
||||
INSERT INTO #TraceEvents VALUES (115,8,'Audit Backup/Restore Event');
|
||||
INSERT INTO #TraceEvents VALUES (116,8,'Audit DBCC Event');
|
||||
INSERT INTO #TraceEvents VALUES (117,8,'Audit Change Audit Event');
|
||||
INSERT INTO #TraceEvents VALUES (118,8,'Audit Object Derived Permission Event');
|
||||
INSERT INTO #TraceEvents VALUES (119,15,'OLEDB Call Event');
|
||||
INSERT INTO #TraceEvents VALUES (120,15,'OLEDB QueryInterface Event');
|
||||
INSERT INTO #TraceEvents VALUES (121,15,'OLEDB DataRead Event');
|
||||
INSERT INTO #TraceEvents VALUES (122,6,'Showplan XML');
|
||||
INSERT INTO #TraceEvents VALUES (123,6,'SQL:FullTextQuery');
|
||||
INSERT INTO #TraceEvents VALUES (124,16,'Broker:Conversation');
|
||||
INSERT INTO #TraceEvents VALUES (125,18,'Deprecation Announcement');
|
||||
INSERT INTO #TraceEvents VALUES (126,18,'Deprecation Final Support');
|
||||
INSERT INTO #TraceEvents VALUES (127,3,'Exchange Spill Event');
|
||||
INSERT INTO #TraceEvents VALUES (128,8,'Audit Database Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (129,8,'Audit Database Object Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (130,8,'Audit Database Principal Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (131,8,'Audit Schema Object Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (132,8,'Audit Server Principal Impersonation Event');
|
||||
INSERT INTO #TraceEvents VALUES (133,8,'Audit Database Principal Impersonation Event');
|
||||
INSERT INTO #TraceEvents VALUES (134,8,'Audit Server Object Take Ownership Event');
|
||||
INSERT INTO #TraceEvents VALUES (135,8,'Audit Database Object Take Ownership Event');
|
||||
INSERT INTO #TraceEvents VALUES (136,16,'Broker:Conversation Group');
|
||||
INSERT INTO #TraceEvents VALUES (137,3,'Blocked process report');
|
||||
INSERT INTO #TraceEvents VALUES (138,16,'Broker:Connection');
|
||||
INSERT INTO #TraceEvents VALUES (139,16,'Broker:Forwarded Message Sent');
|
||||
INSERT INTO #TraceEvents VALUES (140,16,'Broker:Forwarded Message Dropped');
|
||||
INSERT INTO #TraceEvents VALUES (141,16,'Broker:Message Classify');
|
||||
INSERT INTO #TraceEvents VALUES (142,16,'Broker:Transmission');
|
||||
INSERT INTO #TraceEvents VALUES (143,16,'Broker:Queue Disabled');
|
||||
INSERT INTO #TraceEvents VALUES (144,16,'Broker:Mirrored Route State Changed');
|
||||
INSERT INTO #TraceEvents VALUES (146,6,'Showplan XML Statistics Profile');
|
||||
INSERT INTO #TraceEvents VALUES (148,4,'Deadlock graph');
|
||||
INSERT INTO #TraceEvents VALUES (149,16,'Broker:Remote Message Acknowledgement');
|
||||
INSERT INTO #TraceEvents VALUES (150,9,'Trace File Close');
|
||||
INSERT INTO #TraceEvents VALUES (151,2,'Database Mirroring Connection');
|
||||
INSERT INTO #TraceEvents VALUES (152,8,'Audit Change Database Owner');
|
||||
INSERT INTO #TraceEvents VALUES (153,8,'Audit Schema Object Take Ownership Event');
|
||||
INSERT INTO #TraceEvents VALUES (154,8,'Audit Database Mirroring Login');
|
||||
INSERT INTO #TraceEvents VALUES (155,17,'FT:Crawl Started');
|
||||
INSERT INTO #TraceEvents VALUES (156,17,'FT:Crawl Stopped');
|
||||
INSERT INTO #TraceEvents VALUES (157,17,'FT:Crawl Aborted');
|
||||
INSERT INTO #TraceEvents VALUES (158,8,'Audit Broker Conversation');
|
||||
INSERT INTO #TraceEvents VALUES (159,8,'Audit Broker Login');
|
||||
INSERT INTO #TraceEvents VALUES (160,16,'Broker:Message Undeliverable');
|
||||
INSERT INTO #TraceEvents VALUES (161,16,'Broker:Corrupted Message');
|
||||
INSERT INTO #TraceEvents VALUES (162,3,'User Error Message');
|
||||
INSERT INTO #TraceEvents VALUES (163,16,'Broker:Activation');
|
||||
INSERT INTO #TraceEvents VALUES (164,5,'Object:Altered');
|
||||
INSERT INTO #TraceEvents VALUES (165,6,'Performance statistics');
|
||||
INSERT INTO #TraceEvents VALUES (166,13,'SQL:StmtRecompile');
|
||||
INSERT INTO #TraceEvents VALUES (167,2,'Database Mirroring State Change');
|
||||
INSERT INTO #TraceEvents VALUES (168,6,'Showplan XML For Query Compile');
|
||||
INSERT INTO #TraceEvents VALUES (169,6,'Showplan All For Query Compile');
|
||||
INSERT INTO #TraceEvents VALUES (170,8,'Audit Server Scope GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (171,8,'Audit Server Object GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (172,8,'Audit Database Object GDR Event');
|
||||
INSERT INTO #TraceEvents VALUES (173,8,'Audit Server Operation Event');
|
||||
INSERT INTO #TraceEvents VALUES (175,8,'Audit Server Alter Trace Event');
|
||||
INSERT INTO #TraceEvents VALUES (176,8,'Audit Server Object Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (177,8,'Audit Server Principal Management Event');
|
||||
INSERT INTO #TraceEvents VALUES (178,8,'Audit Database Operation Event');
|
||||
INSERT INTO #TraceEvents VALUES (180,8,'Audit Database Object Access Event');
|
||||
INSERT INTO #TraceEvents VALUES (181,12,'TM: Begin Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (182,12,'TM: Begin Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (183,12,'TM: Promote Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (184,12,'TM: Promote Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (185,12,'TM: Commit Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (186,12,'TM: Commit Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (187,12,'TM: Rollback Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (188,12,'TM: Rollback Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (189,4,'Lock:Timeout (timeout > 0)');
|
||||
INSERT INTO #TraceEvents VALUES (190,19,'Progress Report: Online Index Operation');
|
||||
INSERT INTO #TraceEvents VALUES (191,12,'TM: Save Tran starting');
|
||||
INSERT INTO #TraceEvents VALUES (192,12,'TM: Save Tran completed');
|
||||
INSERT INTO #TraceEvents VALUES (193,3,'Background Job Error');
|
||||
INSERT INTO #TraceEvents VALUES (194,15,'OLEDB Provider Information');
|
||||
INSERT INTO #TraceEvents VALUES (195,9,'Mount Tape');
|
||||
INSERT INTO #TraceEvents VALUES (196,20,'Assembly Load');
|
||||
INSERT INTO #TraceEvents VALUES (198,13,'XQuery Static Type');
|
||||
INSERT INTO #TraceEvents VALUES (199,21,'QN: Subscription');
|
||||
INSERT INTO #TraceEvents VALUES (200,21,'QN: Parameter table');
|
||||
INSERT INTO #TraceEvents VALUES (201,21,'QN: Template');
|
||||
INSERT INTO #TraceEvents VALUES (202,21,'QN: Dynamics');
|
||||
INSERT INTO #TraceEvents VALUES (212,3,'Bitmap Warning');
|
||||
INSERT INTO #TraceEvents VALUES (213,3,'Database Suspect Data Page');
|
||||
INSERT INTO #TraceEvents VALUES (214,3,'CPU threshold exceeded');
|
||||
INSERT INTO #TraceEvents VALUES (215,10,'PreConnect:Starting');
|
||||
INSERT INTO #TraceEvents VALUES (216,10,'PreConnect:Completed');
|
||||
INSERT INTO #TraceEvents VALUES (217,6,'Plan Guide Successful');
|
||||
INSERT INTO #TraceEvents VALUES (218,6,'Plan Guide Unsuccessful');
|
||||
INSERT INTO #TraceEvents VALUES (235,8,'Audit Fulltext');
|
||||
-- Declare variables
|
||||
DECLARE @IntervalMinutes INT, @DateStart DATETIME, @DateEnd DATETIME, @TraceFile VARCHAR(200)
|
||||
CREATE TABLE #Info ([LogDate] DATETIME, [ProcessInfo] VARCHAR(1000), [Text] VARCHAR(7000))
|
||||
-- Set configuration values
|
||||
SET @IntervalMinutes = 1440
|
||||
SET @DateEnd = GETDATE()
|
||||
SET @DateStart = DATEADD(mi, -@IntervalMinutes, @DateEnd)
|
||||
-- Read error log
|
||||
IF @@VERSION LIKE 'Microsoft SQL Server 2000%'
|
||||
BEGIN
|
||||
CREATE TABLE #InfoTemp ([ErrorLog] VARCHAR(8000), [ContinuationRow] INT)
|
||||
INSERT INTO #InfoTemp EXEC [xp_readerrorlog]
|
||||
DELETE FROM #InfoTemp WHERE [ContinuationRow] = 1
|
||||
INSERT INTO #Info
|
||||
SELECT (CASE WHEN LEFT([ErrorLog], 1) = CHAR(9) THEN GETDATE() ELSE LEFT([ErrorLog], 22) END),
|
||||
(CASE WHEN LEFT([ErrorLog], 1) = CHAR(9) THEN '' ELSE RTRIM(LTRIM(SUBSTRING([ErrorLog], 23, 11))) END),
|
||||
(CASE WHEN LEFT([ErrorLog], 1) = CHAR(9) THEN ErrorLog ELSE RTRIM(LTRIM(SUBSTRING([ErrorLog], 34, LEN([ErrorLog]) - 34))) END)
|
||||
FROM #InfoTemp
|
||||
DELETE FROM #Info WHERE [LogDate] NOT BETWEEN @DateStart AND @DateEnd
|
||||
DROP TABLE #InfoTemp
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
INSERT INTO #Info EXEC [xp_readerrorlog] 0, 1, NULL, NULL, @DateStart, @DateEnd
|
||||
END
|
||||
-- Get trace file
|
||||
SELECT @TraceFile = CAST([value] AS NVARCHAR(1000))
|
||||
FROM ::fn_trace_getinfo(default)
|
||||
WHERE [traceid] = 1
|
||||
AND [property] = 2
|
||||
-- Read trace file
|
||||
IF @TraceFile <> ''
|
||||
BEGIN
|
||||
INSERT INTO #Info ([LogDate], [Text])
|
||||
SELECT MIN([ftg].[StartTime]), '['+ISNULL([ftg].[DatabaseName],'')+'] '+ISNULL([otn].[ObjectName],'')+' '+ISNULL(REPLACE([te].[name],'Object:',''),'')+' by '+ISNULL([ftg].[LoginName],'')+' with: '+ISNULL([ftg].[ApplicationName],'n/a')
|
||||
FROM ::fn_trace_gettable(@TraceFile, DEFAULT) [ftg]
|
||||
INNER JOIN #TraceEvents [te] ON [te].[trace_event_id] = [ftg].[EventClass]
|
||||
INNER JOIN #ObjectTypeName [otn] ON [otn].[ObjectType] = [ftg].[ObjectType]
|
||||
WHERE [ftg].[StartTime] BETWEEN @DateStart AND @DateEnd
|
||||
AND ISNULL([ftg].[ObjectType], 0) NOT IN (21587/*Statistics*/)
|
||||
AND NOT (ISNULL([ftg].[DatabaseID], 0) = 2/*TempDB*/ AND [ftg].[ObjectType] IN (8277/*User-Defined Table*/, 22601/*Index*/))
|
||||
GROUP BY '['+ISNULL([ftg].[DatabaseName],'')+'] '+ISNULL([otn].[ObjectName],'')+' '+ISNULL(REPLACE([te].[name],'Object:',''),'')+' by '+ISNULL([ftg].[LoginName],'')+' with: '+ISNULL([ftg].[ApplicationName],'n/a')
|
||||
END
|
||||
-- Delete exclusions
|
||||
DELETE [i] FROM #Info [i] INNER JOIN #ExclusionList [li] ON [i].[Text] LIKE '%'+[li].[stringValue]+'%'
|
||||
-- Read TempDB size
|
||||
IF @@VERSION LIKE 'Microsoft SQL Server 2000%'
|
||||
BEGIN
|
||||
IF (SELECT SUM([size]*8.0/1024) 'Current size in MB'
|
||||
FROM [tempdb].[dbo].[sysfiles])
|
||||
/
|
||||
(SELECT SUM([size]*8.0/1024) 'Initial size in MB'
|
||||
FROM [master].[dbo].[sysaltfiles]
|
||||
WHERE [dbid] = 2)
|
||||
> 2
|
||||
BEGIN
|
||||
INSERT INTO #Info ([LogDate], [Text])
|
||||
VALUES (GETDATE(), '[TempDB] current size more than twice greater of initial size')
|
||||
END
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
IF (SELECT SUM([size]*8.0/1024) 'Current size in MB'
|
||||
FROM [tempdb].[sys].[database_files])
|
||||
/
|
||||
(SELECT SUM([size]*8.0/1024) 'Initial size in MB'
|
||||
FROM [master].[sys].[sysaltfiles]
|
||||
WHERE [dbid] = 2)
|
||||
> 2
|
||||
BEGIN
|
||||
INSERT INTO #Info ([LogDate], [Text])
|
||||
VALUES (GETDATE(), '[TempDB] current size more than twice greater of initial size')
|
||||
END
|
||||
END
|
||||
-- Finish
|
||||
SELECT * FROM #Info ORDER BY [LogDate]
|
||||
DROP TABLE #Info
|
||||
-- Unload setup
|
||||
DROP TABLE #ExclusionList
|
||||
DROP TABLE #ObjectTypeName
|
||||
DROP TABLE #TraceEvents
|
||||
@@ -0,0 +1,109 @@
|
||||
Optymalizator zapytań
|
||||
|
||||
1. informacja o optymalzatorze
|
||||
select * from sys.dm_exec_query_optimizer_info
|
||||
|
||||
!! Pamiętajmy o czyszczeniu cache przed uruchomieniem zapytań żeby mieć pewność że zapytanie zostanie zoptymalizowane.
|
||||
|
||||
2. Zebranie informacji o optymalizacji
|
||||
|
||||
-- optymalizacja tych zapytań teraz,
|
||||
-- aby nie zaburzały zebranych danych
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
DROP TABLE before_query_optimizer_info
|
||||
DROP TABLE after_query_optimizer_info
|
||||
GO
|
||||
-- rozpoczęcie właściwego wykonywania
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
-- tutaj wstaw swoje zapytanie
|
||||
SELECT *
|
||||
FROM Person.Address
|
||||
-- zachowaj poniższe, aby wymusić nową optymalizację
|
||||
OPTION (RECOMPILE)
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_optimizer_info
|
||||
FROM sys.dm_exec_query_optimizer_info
|
||||
GO
|
||||
SELECT a.counter,
|
||||
(a.occurrence - b.occurrence) AS occurrence,
|
||||
(a.occurrence * a.value - b.occurrence *
|
||||
b.value) AS value
|
||||
FROM before_query_optimizer_info b
|
||||
JOIN after_query_optimizer_info a
|
||||
ON b.counter = a.counter
|
||||
WHERE b.occurrence <> a.occurrence
|
||||
DROP TABLE before_query_optimizer_info
|
||||
DROP TABLE after_query_optimizer_info
|
||||
|
||||
3. Liczba transformacji zapytania
|
||||
|
||||
-- optymalizacja tych zapytań teraz,
|
||||
-- aby nie zaburzały zebranych danych
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
DROP TABLE after_query_transformation_stats
|
||||
DROP TABLE before_query_transformation_stats
|
||||
-- rozpoczęcie właściwego wykonywania
|
||||
GO
|
||||
SELECT *
|
||||
INTO before_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
-- tutaj wstaw swoje zapytanie
|
||||
SELECT * FROM Sales.SalesOrderDetail
|
||||
WHERE SalesOrderID = 43659
|
||||
-- zachowaj poniższe, aby wymusić nową optymalizację
|
||||
OPTION (RECOMPILE)
|
||||
GO
|
||||
SELECT *
|
||||
INTO after_query_transformation_stats
|
||||
FROM sys.dm_exec_query_transformation_stats
|
||||
GO
|
||||
SELECT a.name, (a.promised - b.promised) as promised
|
||||
FROM before_query_transformation_stats b
|
||||
JOIN after_query_transformation_stats a
|
||||
ON b.name = a.name
|
||||
WHERE b.succeeded <> a.succeeded
|
||||
DROP TABLE before_query_transformation_stats
|
||||
DROP TABLE after_query_transformation_stats
|
||||
|
||||
4. Statystyki
|
||||
|
||||
- Możesz wykorzystać nieudokumentowane flagi 9292 i 9204 do wyświetlenia
|
||||
informacji o statystykach załadowanych podczas procesu optymalizacji. Uruchom
|
||||
zapytanie:
|
||||
|
||||
|
||||
OPTION (RECOMPILE, QUERYTRACEON 9292, QUERYTRACEON 9204)
|
||||
|
||||
|
||||
- Flagi 9292 można użyć do wyświetlenia obiektów statystyk uważanych za interesujące.
|
||||
Uruchom poniższe zapytanie:
|
||||
|
||||
OPTION (RECOMPILE, QUERYTRACEON 9292)
|
||||
|
||||
- Flagi 9204 można użyć do wyświetlenia obiektów statystyk, które zostały wykorzystane
|
||||
podczas szacowania kardynalności
|
||||
|
||||
OPTION (RECOMPILE, QUERYTRACEON 9204)
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
1. sys.dm_exec_requests i sys.dm_exec_sessions - pokazuje jeszcze idąde zapytania
|
||||
|
||||
cpu_time Czas procesora w milisekundach wykorzystany przez żądanie lub przez żądania w sesji.
|
||||
total_elapsed_time Całkowity czas w milisekundach od odebrania żądania lub od początku sesji.
|
||||
reads Liczba odczytów wykonanych przez żądanie lub żądania w sesji.
|
||||
writes Liczba zapisów wykonanych przez żądanie lub żądania w sesji.
|
||||
logical_reads Liczba odczytów logicznych wykonanych przez żądanie lub żądania w sesji.
|
||||
row_count Liczba wierszy zwróconych do klienta na podstawie tego żądania.
|
||||
|
||||
SELECT cpu_time, reads, total_elapsed_time, logical_reads, row_count
|
||||
FROM sys.dm_exec_requests
|
||||
WHERE session_id = 56
|
||||
GO
|
||||
SELECT cpu_time, reads, total_elapsed_time, logical_reads, row_count
|
||||
FROM sys.dm_exec_sessions
|
||||
WHERE session_id = 56
|
||||
|
||||
2. sys.dm_exec_query_stats - zintegrowane informacje o wydajności
|
||||
|
||||
SELECT * FROM sys.dm_exec_query_stats
|
||||
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
|
||||
WHERE objectid = OBJECT_ID('dbo.test')
|
||||
|
||||
SELECT SUBSTRING(text, (statement_start_offset/2) + 1,
|
||||
((CASE statement_end_offset
|
||||
WHEN -1
|
||||
THEN DATALENGTH(text)
|
||||
ELSE
|
||||
statement_end_offset
|
||||
END
|
||||
- statement_start_offset)/2) + 1) AS statement_text, *
|
||||
FROM sys.dm_exec_query_stats
|
||||
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
|
||||
WHERE objectid = OBJECT_ID('dbo.test')
|
||||
|
||||
pokazuje tylko zakończone zapytania
|
||||
Opis kolumn
|
||||
total_worker_time Całkowity czas procesora w mikrosekundach (z dokładnością do milisekund)
|
||||
dla wszystkich wykonań planu od jego kompilacji.
|
||||
last_worker_time Czas procesora w mikrosekundach (z dokładnością do milisekund) dla ostatniego
|
||||
wykonania planu.
|
||||
min_worker_time Najkrótszy czas procesora w mikrosekundach (z dokładnością do milisekund) spośród
|
||||
wszystkich wykonań planu.
|
||||
max_worker_time Maksymalny czas procesora w mikrosekundach (z dokładnością do milisekund)
|
||||
spośród wszystkich wykonań planu.
|
||||
total_physical_reads Sumaryczna liczba odczytów fizycznych dla planu od czasu jego skompilowania.
|
||||
last_physical_reads Liczba odczytów fizycznych podczas ostatniego wykonania planu.
|
||||
min_physical_reads Minimalna liczba odczytów fizycznych spośród wszystkich wykonań planu.
|
||||
max_physical_reads Maksymalna liczba odczytów fizycznych spośród wszystkich wykonań planu.
|
||||
total_logical_writes Sumaryczna liczba zapisów logicznych dla planu od czasu jego skompilowania.
|
||||
last_logical_writes Liczba zapisów logicznych podczas ostatniego wykonania planu.
|
||||
min_logical_writes Minimalna liczba zapisów logicznych spośród wszystkich wykonań planu.
|
||||
max_logical_writes Maksymalna liczba zapisów logicznych spośród wszystkich wykonań planu.
|
||||
total_logical_reads Sumaryczna liczba odczytów logicznych dla planu od czasu jego skompilowania.
|
||||
last_logical_reads Liczba odczytów logicznych podczas ostatniego wykonania planu.
|
||||
min_logical_reads Minimalna liczba odczytów logicznych spośród wszystkich wykonań planu.
|
||||
max_logical_reads Maksymalna liczba odczytów logicznych spośród wszystkich wykonań planu.
|
||||
total_clr_time Czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz obiektów
|
||||
wspólnego środowiska uruchomieniowego (CLR) .NET Framework podczas wszystkich
|
||||
uruchomień tego planu od czasu jego kompilacji. Obiekty CLR mogą być procedurami
|
||||
przechowywanymi, funkcjami, wyzwalaczami, typami i agregacjami.
|
||||
last_clr_time Czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz obiektów
|
||||
CLR .NET Framework podczas ostatniego uruchomienia planu. Obiekty CLR mogą być
|
||||
procedurami przechowywanymi, funkcjami, wyzwalaczami, typami i agregacjami.
|
||||
min_clr_time Minimalny czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz
|
||||
obiektów CLR .NET Framework spośród wszystkich uruchomień planu. Obiekty CLR mogą
|
||||
być procedurami przechowywanymi, funkcjami, wyzwalaczami, typami i agregacjami.
|
||||
max_clr_time Maksymalny czas w mikrosekundach (z dokładnością do milisekund) spędzony wewnątrz
|
||||
obiektów CLR .NET Framework spośród wszystkich uruchomień planu. Obiekty CLR mogą
|
||||
total_elapsed_time Sumaryczny czas w mikrosekundach (z dokładnością do milisekund) dla wszystkich
|
||||
zakończonych uruchomień planu.
|
||||
last_elapsed_time Czas w mikrosekundach (z dokładnością do milisekund) dla ostatniego uruchomienia
|
||||
planu.
|
||||
min_elapsed_time Najkrótszy czas w mikrosekundach (z dokładnością do milisekunda) spośród wszystkich
|
||||
ukończonych uruchomień planu.
|
||||
max_elapsed_time Najdłuższy czas w mikrosekundach (z dokładnością do milisekunda) spośród wszystkich
|
||||
ukończonych uruchomień planu.
|
||||
|
||||
3. Szukanie kosztownych zapytań
|
||||
|
||||
SELECT TOP 20 query_stats.query_hash,
|
||||
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count)
|
||||
AS avg_cpu_time,
|
||||
MIN(query_stats.statement_text) AS statement_text
|
||||
FROM
|
||||
(SELECT qs.*,
|
||||
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) AS statement_text
|
||||
FROM sys.dm_exec_query_stats qs
|
||||
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st) AS query_stats
|
||||
GROUP BY query_stats.query_hash
|
||||
ORDER BY avg_cpu_time DESC
|
||||
|
||||
SELECT TOP 20 query_plan_hash,
|
||||
SUM(total_worker_time) / SUM(execution_count) AS avg_cpu_time,
|
||||
MIN(plan_handle) AS plan_handle, MIN(text) AS query_text
|
||||
FROM sys.dm_exec_query_stats qs
|
||||
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) AS st
|
||||
GROUP BY query_plan_hash
|
||||
ORDER BY avg_cpu_time DESC
|
||||
|
||||
Przykłady powyższe bazują na czasie procesora
|
||||
|
||||
Zaytanie zwraca najbardziej kosztowne zapytania
|
||||
SELECT TOP 20 SUBSTRING(st.text, (er.statement_start_offset/2) + 1,
|
||||
((CASE statement_end_offset
|
||||
WHEN -1
|
||||
THEN DATALENGTH(st.text)
|
||||
ELSE
|
||||
er.statement_end_offset
|
||||
END
|
||||
- er.statement_start_offset)/2) + 1) AS statement_text
|
||||
, *
|
||||
FROM sys.dm_exec_requests er
|
||||
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) st
|
||||
ORDER BY total_elapsed_time DESC
|
||||
|
||||
|
||||
4. Zdarzenia rozszerzone
|
||||
4.1 Lista zdarzeń jakie możemy monitorować
|
||||
SELECT name, description
|
||||
FROM sys.dm_xe_objects
|
||||
WHERE object_type = 'event' AND
|
||||
(capabilities & 1 = 0 OR capabilities IS NULL)
|
||||
ORDER BY name
|
||||
|
||||
--- tworzenie takiego trace
|
||||
|
||||
CREATE EVENT SESSION test ON SERVER
|
||||
ADD EVENT sqlserver.module_end(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.rpc_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.sp_statement_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.sql_batch_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text)),
|
||||
ADD EVENT sqlserver.sql_statement_completed(
|
||||
ACTION(sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,
|
||||
sqlserver.sql_text))
|
||||
ADD TARGET package0.ring_buffer
|
||||
WITH (STARTUP_STATE=OFF)
|
||||
|
||||
--- nie można zapomnieć o jej uruchomieniu
|
||||
|
||||
ALTER EVENT SESSION [test]
|
||||
ON SERVER
|
||||
STATE=START
|
||||
|
||||
|
||||
--- odczytanie danych ze zdarzeń, dane są w formacie XML
|
||||
|
||||
SELECT name, target_name, execution_count, CAST(target_data AS xml)
|
||||
AS target_data
|
||||
FROM sys.dm_xe_sessions s
|
||||
JOIN sys.dm_xe_session_targets t
|
||||
ON s.address = t.event_session_address
|
||||
WHERE s.name = 'test'
|
||||
|
||||
--- odpytanie XML żeby nie trzeba było za bardzo czytać XML
|
||||
|
||||
SELECT
|
||||
event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
|
||||
event_data.value('(event/action[@name="query_hash"]/value)[1]','varchar(max)')
|
||||
AS query_hash,
|
||||
event_data.value('(event/data[@name="cpu_time"]/value)[1]', 'int')
|
||||
AS cpu_time,
|
||||
event_data.value('(event/data[@name="duration"]/value)[1]', 'int')
|
||||
AS duration,
|
||||
event_data.value('(event/data[@name="logical_reads"]/value)[1]', 'int')
|
||||
AS logical_reads,
|
||||
event_data.value('(event/data[@name="physical_reads"]/value)[1]', 'int')
|
||||
AS physical_reads,
|
||||
event_data.value('(event/data[@name="writes"]/value)[1]', 'int') AS writes,
|
||||
event_data.value('(event/data[@name="statement"]/value)[1]', 'varchar(max)')
|
||||
AS statement
|
||||
FROM(SELECT evnt.query('.') AS event_data
|
||||
FROM
|
||||
(SELECT CAST(target_data AS xml) AS target_data
|
||||
FROM sys.dm_xe_sessions s
|
||||
JOIN sys.dm_xe_session_targets t
|
||||
ON s.address = t.event_session_address
|
||||
WHERE s.name = 'test'
|
||||
AND t.target_name = 'ring_buffer'
|
||||
) AS data
|
||||
CROSS APPLY target_data.nodes('RingBufferTarget/event') AS xevent(evnt)
|
||||
) AS xevent(event_data)
|
||||
|
||||
--- powyższe zapytanie będzie nie bardzo czytelne można więc przerzucić dane do tabeli np SELECT INTO i wykonać poniższe zapytanie
|
||||
SELECT query_hash, SUM(cpu_time) AS cpu_time, SUM(duration) AS duration,
|
||||
SUM(logical_reads) AS logical_reads, SUM(physical_reads) AS physical_reads,
|
||||
SUM(writes) AS writes, MAX(statement) AS statement
|
||||
FROM #eventdata
|
||||
GROUP BY query_hash
|
||||
|
||||
--- po zakończeni analizy należy usunąć
|
||||
ALTER EVENT SESSION [test]
|
||||
ON SERVER
|
||||
STATE=STOP
|
||||
GO
|
||||
DROP EVENT SESSION [test] ON SERVER
|
||||
|
||||
--- Uruchomienie dla jednej sesji
|
||||
CREATE EVENT SESSION [test] ON SERVER
|
||||
ADD EVENT sqlos.wait_info(
|
||||
WHERE ([sqlserver].[session_id]=(61)))
|
||||
ADD TARGET package0.ring_buffer
|
||||
WITH (STARTUP_STATE=OFF)
|
||||
GO
|
||||
--- Uruchomienie zdarzenia:
|
||||
ALTER EVENT SESSION [test]
|
||||
ON SERVER
|
||||
STATE=START
|
||||
--- odczytanie tych danych
|
||||
SELECT
|
||||
event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
|
||||
event_data.value('(event/data[@name="wait_type"]/text)[1]', 'varchar(40)')
|
||||
AS wait_type,
|
||||
event_data.value('(event/data[@name="duration"]/value)[1]', 'int')
|
||||
AS duration,
|
||||
event_data.value('(event/data[@name="opcode"]/text)[1]', 'varchar(40)')
|
||||
AS opcode,
|
||||
event_data.value('(event/data[@name="signal_duration"]/value)[1]', 'int')
|
||||
AS signal_duration
|
||||
FROM(SELECT evnt.query('.') AS event_data
|
||||
FROM
|
||||
(SELECT CAST(target_data AS xml) AS target_data
|
||||
FROM sys.dm_xe_sessions s
|
||||
JOIN sys.dm_xe_session_targets t
|
||||
ON s.address = t.event_session_address
|
||||
WHERE s.name = 'test'
|
||||
AND t.target_name = 'ring_buffer'
|
||||
) AS data
|
||||
CROSS APPLY target_data.nodes('RingBufferTarget/event') AS xevent(evnt)
|
||||
) AS xevent(event_data)
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
-- If you need more information, here is a nice SQL script, which I use from time to time:
|
||||
DECLARE @TabName varchar(100)
|
||||
|
||||
CREATE TABLE #temp (
|
||||
TabName varchar(200), IndexName varchar(200), IndexDescr varchar(200),
|
||||
IndexKeys varchar(200), IndexSize int
|
||||
)
|
||||
|
||||
DECLARE cur CURSOR FAST_FORWARD LOCAL FOR
|
||||
SELECT name FROM sysobjects WHERE xtype = 'U'
|
||||
|
||||
OPEN cur
|
||||
|
||||
FETCH NEXT FROM cur INTO @TabName
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
INSERT INTO #temp (IndexName, IndexDescr, IndexKeys)
|
||||
EXEC sp_helpindex @TabName
|
||||
|
||||
UPDATE #temp SET TabName = @TabName WHERE TabName IS NULL
|
||||
|
||||
FETCH NEXT FROM cur INTO @TabName
|
||||
END
|
||||
|
||||
CLOSE cur
|
||||
DEALLOCATE cur
|
||||
|
||||
DECLARE @ValueCoef int
|
||||
SELECT @ValueCoef = low FROM Master.dbo.spt_values WHERE number = 1 AND type = N'E'
|
||||
|
||||
UPDATE #temp SET IndexSize =
|
||||
((CAST(sysindexes.used AS bigint) * @ValueCoef)/1024)/1024
|
||||
FROM sysobjects INNER JOIN sysindexes ON sysobjects.id = sysindexes.id
|
||||
INNER JOIN #temp T ON T.TabName = sysobjects.name AND T.IndexName = sysindexes.name
|
||||
|
||||
SELECT * FROM #temp
|
||||
ORDER BY TabName, IndexName
|
||||
|
||||
DROP TABLE #temp
|
||||
@@ -0,0 +1,4 @@
|
||||
select * from sys.dm_db_index_usage_stats
|
||||
where-- object_id=399340487
|
||||
user_scans=0 and user_seeks=0 and user_lookups=0
|
||||
and database_id=40
|
||||
@@ -0,0 +1,144 @@
|
||||
-- tworzy skrypt do tworzenia indeksów,
|
||||
--bardzo przydatny do przenoszenia bazy wraz z obiektami albo do odgrywania brakujących indeksów
|
||||
|
||||
SELECT ' CREATE ' +
|
||||
CASE
|
||||
WHEN I.is_unique = 1 THEN ' UNIQUE '
|
||||
ELSE ''
|
||||
END +
|
||||
I.type_desc COLLATE DATABASE_DEFAULT + ' INDEX ' +
|
||||
I.name + ' ON ' +
|
||||
SCHEMA_NAME(T.schema_id) + '.' + T.name + ' ( ' +
|
||||
KeyColumns + ' ) ' +
|
||||
ISNULL(' INCLUDE (' + IncludedColumns + ' ) ', '') +
|
||||
ISNULL(' WHERE ' + I.filter_definition, '') + ' WITH ( ' +
|
||||
CASE
|
||||
WHEN I.is_padded = 1 THEN ' PAD_INDEX = ON '
|
||||
ELSE ' PAD_INDEX = OFF '
|
||||
END + ',' +
|
||||
'FILLFACTOR = ' + CONVERT(
|
||||
CHAR(5),
|
||||
CASE
|
||||
WHEN I.fill_factor = 0 THEN 100
|
||||
ELSE I.fill_factor
|
||||
END
|
||||
) + ',' +
|
||||
-- default value
|
||||
'SORT_IN_TEMPDB = OFF ' + ',' +
|
||||
CASE
|
||||
WHEN I.ignore_dup_key = 1 THEN ' IGNORE_DUP_KEY = ON '
|
||||
ELSE ' IGNORE_DUP_KEY = OFF '
|
||||
END + ',' +
|
||||
CASE
|
||||
WHEN ST.no_recompute = 0 THEN ' STATISTICS_NORECOMPUTE = OFF '
|
||||
ELSE ' STATISTICS_NORECOMPUTE = ON '
|
||||
END + ',' +
|
||||
' ONLINE = OFF ' + ',' +
|
||||
CASE
|
||||
WHEN I.allow_row_locks = 1 THEN ' ALLOW_ROW_LOCKS = ON '
|
||||
ELSE ' ALLOW_ROW_LOCKS = OFF '
|
||||
END + ',' +
|
||||
CASE
|
||||
WHEN I.allow_page_locks = 1 THEN ' ALLOW_PAGE_LOCKS = ON '
|
||||
ELSE ' ALLOW_PAGE_LOCKS = OFF '
|
||||
END + ' ) ON [' +
|
||||
DS.name + ' ] ' + CHAR(13) + CHAR(10) + ' GO' [CreateIndexScript]
|
||||
FROM sys.indexes I
|
||||
JOIN sys.tables T
|
||||
ON T.object_id = I.object_id
|
||||
JOIN sys.sysindexes SI
|
||||
ON I.object_id = SI.id
|
||||
AND I.index_id = SI.indid
|
||||
JOIN (
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT IC2.object_id,
|
||||
IC2.index_id,
|
||||
STUFF(
|
||||
(
|
||||
SELECT ' , ' + C.name + CASE
|
||||
WHEN MAX(CONVERT(INT, IC1.is_descending_key))
|
||||
= 1 THEN
|
||||
' DESC '
|
||||
ELSE
|
||||
' ASC '
|
||||
END
|
||||
FROM sys.index_columns IC1
|
||||
JOIN sys.columns C
|
||||
ON C.object_id = IC1.object_id
|
||||
AND C.column_id = IC1.column_id
|
||||
AND IC1.is_included_column =
|
||||
0
|
||||
WHERE IC1.object_id = IC2.object_id
|
||||
AND IC1.index_id = IC2.index_id
|
||||
GROUP BY
|
||||
IC1.object_id,
|
||||
C.name,
|
||||
index_id
|
||||
ORDER BY
|
||||
MAX(IC1.key_ordinal)
|
||||
FOR XML PATH('')
|
||||
),
|
||||
1,
|
||||
2,
|
||||
''
|
||||
) KeyColumns
|
||||
FROM sys.index_columns IC2
|
||||
--WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables
|
||||
GROUP BY
|
||||
IC2.object_id,
|
||||
IC2.index_id
|
||||
) tmp3
|
||||
)tmp4
|
||||
ON I.object_id = tmp4.object_id
|
||||
AND I.Index_id = tmp4.index_id
|
||||
JOIN sys.stats ST
|
||||
ON ST.object_id = I.object_id
|
||||
AND ST.stats_id = I.index_id
|
||||
JOIN sys.data_spaces DS
|
||||
ON I.data_space_id = DS.data_space_id
|
||||
JOIN sys.filegroups FG
|
||||
ON I.data_space_id = FG.data_space_id
|
||||
LEFT JOIN (
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT IC2.object_id,
|
||||
IC2.index_id,
|
||||
STUFF(
|
||||
(
|
||||
SELECT ' , ' + C.name
|
||||
FROM sys.index_columns IC1
|
||||
JOIN sys.columns C
|
||||
ON C.object_id = IC1.object_id
|
||||
AND C.column_id = IC1.column_id
|
||||
AND IC1.is_included_column =
|
||||
1
|
||||
WHERE IC1.object_id = IC2.object_id
|
||||
AND IC1.index_id = IC2.index_id
|
||||
GROUP BY
|
||||
IC1.object_id,
|
||||
C.name,
|
||||
index_id
|
||||
FOR XML PATH('')
|
||||
),
|
||||
1,
|
||||
2,
|
||||
''
|
||||
) IncludedColumns
|
||||
FROM sys.index_columns IC2
|
||||
--WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables
|
||||
GROUP BY
|
||||
IC2.object_id,
|
||||
IC2.index_id
|
||||
) tmp1
|
||||
WHERE IncludedColumns IS NOT NULL
|
||||
) tmp2
|
||||
ON tmp2.object_id = I.object_id
|
||||
AND tmp2.index_id = I.index_id
|
||||
WHERE I.is_primary_key = 0
|
||||
AND I.is_unique_constraint = 0
|
||||
--AND T.name NOT LIKE 'mt_%'
|
||||
--AND I.name NOT LIKE 'mt_%'
|
||||
--AND I.Object_id = object_id('Person.Address') --Comment for all tables
|
||||
--AND I.name = 'IX_Address_PostalCode' --comment for all indexes
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
select schema_name(o.schema_id) as [schema_name] ,
|
||||
object_name(o.object_id) as [table_name] ,
|
||||
i.name as [index_name] ,
|
||||
i.type_desc as [index_type] ,
|
||||
dmv.page_count ,
|
||||
dmv.fragment_count ,
|
||||
round(dmv.avg_fragment_size_in_pages, 2, 2) [avg_fragment_size_in_pages] ,
|
||||
round(dmv.avg_fragmentation_in_percent, 2, 2) [avg_fragmentation_in_percent] ,
|
||||
case when dmv.avg_fragmentation_in_percent <= 5 then 'RELAX'
|
||||
when dmv.avg_fragmentation_in_percent <= 30 then 'REORGANIZE'
|
||||
when dmv.avg_fragmentation_in_percent > 30 then 'REBUILD'
|
||||
end as [action] ,
|
||||
stats_date(dmv.object_id, i.index_id) as stats_update_date ,
|
||||
case when isnull(ps.function_id, 1) = 1 then 'NO'
|
||||
else 'YES'
|
||||
end as partitioned ,
|
||||
coalesce(fg.name, fgp.name) as [file_group_name] ,
|
||||
p.partition_number as [partition_number] ,
|
||||
p.rows as [partition_rows] ,
|
||||
prv_left.value as [partition_lower_boundary_value] ,
|
||||
prv_right.value as [partition_upper_boundary_value] ,
|
||||
case when pf.boundary_value_on_right = 1 then 'RIGHT'
|
||||
when pf.boundary_value_on_right = 0 then 'LEFT'
|
||||
else 'NONE'
|
||||
end as [partition_range] ,
|
||||
pf.name as [partition_function] ,
|
||||
ds.name as [partition_scheme]
|
||||
from sys.partitions as p with ( readpast )
|
||||
inner join sys.indexes as i with ( readpast ) on i.object_id = p.object_id
|
||||
and i.index_id = p.index_id
|
||||
inner join sys.objects as o with ( readpast ) on o.object_id = i.object_id
|
||||
inner join sys.dm_db_index_physical_stats(db_id(), null, null, null,
|
||||
N'LIMITED') dmv on dmv.OBJECT_ID = i.object_id
|
||||
and dmv.index_id = i.index_id
|
||||
and dmv.partition_number = p.partition_number
|
||||
left join sys.data_spaces as ds with ( readpast ) on ds.data_space_id = i.data_space_id
|
||||
left join sys.partition_schemes as ps with ( readpast ) on ps.data_space_id = ds.data_space_id
|
||||
left join sys.partition_functions as pf with ( readpast ) on pf.function_id = ps.function_id
|
||||
left join sys.destination_data_spaces as dds with ( readpast ) on dds.partition_scheme_id = ps.data_space_id
|
||||
and dds.destination_id = p.partition_number
|
||||
left join sys.filegroups as fg with ( readpast ) on fg.data_space_id = i.data_space_id
|
||||
left join sys.filegroups as fgp with ( readpast ) on fgp.data_space_id = dds.data_space_id
|
||||
left join sys.partition_range_values as prv_left with ( readpast ) on ps.function_id = prv_left.function_id
|
||||
and prv_left.boundary_id = p.partition_number
|
||||
- 1
|
||||
left join sys.partition_range_values as prv_right with ( readpast ) on ps.function_id = prv_right.function_id
|
||||
and prv_right.boundary_id = p.partition_number
|
||||
where objectproperty(p.object_id, 'ISMSShipped') = 0
|
||||
order by [avg_fragmentation_in_percent] DESC,
|
||||
[table_name] ,
|
||||
[index_name]
|
||||
@@ -0,0 +1,20 @@
|
||||
-- listuje indeksy które założone są w bazie danych
|
||||
select
|
||||
i.name as IndexName,
|
||||
o.name as TableName,
|
||||
ic.key_ordinal as ColumnOrder,
|
||||
ic.is_included_column as IsIncluded,
|
||||
co.[name] as ColumnName
|
||||
from sys.indexes i
|
||||
join sys.objects o on i.object_id = o.object_id
|
||||
join sys.index_columns ic on ic.object_id = i.object_id
|
||||
and ic.index_id = i.index_id
|
||||
join sys.columns co on co.object_id = i.object_id
|
||||
and co.column_id = ic.column_id
|
||||
where i.[type] = 2
|
||||
and i.is_unique = 0
|
||||
and i.is_primary_key = 0
|
||||
and o.[type] = 'U'
|
||||
--and ic.is_included_column = 0
|
||||
order by o.[name], i.[name], ic.is_included_column, ic.key_ordinal
|
||||
;
|
||||
@@ -0,0 +1,32 @@
|
||||
-- Missing Index Script
|
||||
-- Original Author: Pinal Dave
|
||||
SELECT TOP 25
|
||||
dm_mid.database_id AS DatabaseID,
|
||||
dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
|
||||
dm_migs.last_user_seek AS Last_User_Seek,
|
||||
OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
|
||||
'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
|
||||
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','')
|
||||
+ CASE
|
||||
WHEN dm_mid.equality_columns IS NOT NULL
|
||||
AND dm_mid.inequality_columns IS NOT NULL THEN '_'
|
||||
ELSE ''
|
||||
END
|
||||
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
|
||||
+ ']'
|
||||
+ ' ON ' + dm_mid.statement
|
||||
+ ' (' + ISNULL (dm_mid.equality_columns,'')
|
||||
+ CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns
|
||||
IS NOT NULL THEN ',' ELSE
|
||||
'' END
|
||||
+ ISNULL (dm_mid.inequality_columns, '')
|
||||
+ ')'
|
||||
+ ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement
|
||||
FROM sys.dm_db_missing_index_groups dm_mig
|
||||
INNER JOIN sys.dm_db_missing_index_group_stats dm_migs
|
||||
ON dm_migs.group_handle = dm_mig.index_group_handle
|
||||
INNER JOIN sys.dm_db_missing_index_details dm_mid
|
||||
ON dm_mig.index_handle = dm_mid.index_handle
|
||||
WHERE dm_mid.database_ID = DB_ID()
|
||||
ORDER BY Avg_Estimated_Impact DESC
|
||||
GO
|
||||
@@ -0,0 +1,31 @@
|
||||
-- Script - Find Details for Statistics of Whole Database
|
||||
-- (c) Pinal Dave
|
||||
-- Download Script from - http://go.sqlauthority.com
|
||||
SELECT DISTINCT
|
||||
OBJECT_NAME(s.[object_id]) AS TableName,
|
||||
c.name AS ColumnName,
|
||||
s.name AS StatName,
|
||||
STATS_DATE(s.[object_id], s.stats_id) AS LastUpdated,
|
||||
DATEDIFF(d,STATS_DATE(s.[object_id], s.stats_id),getdate()) DaysOld,
|
||||
dsp.modification_counter,
|
||||
s.auto_created,
|
||||
s.user_created,
|
||||
s.no_recompute,
|
||||
s.[object_id],
|
||||
s.stats_id,
|
||||
sc.stats_column_id,
|
||||
sc.column_id
|
||||
FROM sys.stats s
|
||||
JOIN sys.stats_columns sc
|
||||
ON sc.[object_id] = s.[object_id] AND sc.stats_id = s.stats_id
|
||||
JOIN sys.columns c ON c.[object_id] = sc.[object_id] AND c.column_id = sc.column_id
|
||||
JOIN sys.partitions par ON par.[object_id] = s.[object_id]
|
||||
JOIN sys.objects obj ON par.[object_id] = obj.[object_id]
|
||||
CROSS APPLY sys.dm_db_stats_properties(sc.[object_id], s.stats_id) AS dsp
|
||||
WHERE OBJECTPROPERTY(s.OBJECT_ID,'IsUserTable') = 1
|
||||
AND (s.auto_created = 1 OR s.user_created = 1)
|
||||
ORDER BY DaysOld;
|
||||
|
||||
|
||||
EXEC sp_updatestats;
|
||||
GO
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
Wyświetla wszystkie Page Latch w bazie danych
|
||||
*/
|
||||
|
||||
select q.text, r.status, r.wait_type, r.wait_resource, r.wait_time from
|
||||
sys.dm_exec_requests r
|
||||
inner join sys.dm_exec_sessions s
|
||||
on s.session_id=r.session_id
|
||||
cross apply sys.dm_exec_sql_text(r.sql_handle) q
|
||||
where s.is_user_process=1
|
||||
and r.status<>'running'
|
||||
and r.wait_type like 'PAGELATCH%'
|
||||
order by r.wait_resource
|
||||
|
||||
-- sprawdzenie potem co jest w ym bloku
|
||||
|
||||
dbcc page(40, 43, 14988552, 3) with tableresults
|
||||
|
||||
-- jeśli to jest index to sprawdzamy który to jest
|
||||
|
||||
select * from sys.indexes
|
||||
where object_id=399340487
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
-- pokazuje tylko sesje ktore wykonuja zapis do bazy danych
|
||||
SELECT * FROM
|
||||
sys.dm_exec_sessions
|
||||
WHERE is_user_process = 1
|
||||
AND writes > 0;
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
DECLARE @databaseName sysname
|
||||
DECLARE @backupStartDate datetime
|
||||
DECLARE @backup_set_id_start INT
|
||||
DECLARE @backup_set_id_end INT
|
||||
|
||||
-- set database to be used
|
||||
SET @databaseName = 'enterDatabaseNameHere'
|
||||
|
||||
SELECT @backup_set_id_start = MAX(backup_set_id)
|
||||
FROM msdb.dbo.backupset
|
||||
WHERE database_name = @databaseName AND type = 'D'
|
||||
|
||||
SELECT @backup_set_id_end = MIN(backup_set_id)
|
||||
FROM msdb.dbo.backupset
|
||||
WHERE database_name = @databaseName AND type = 'D'
|
||||
AND backup_set_id > @backup_set_id_start
|
||||
|
||||
IF @backup_set_id_end IS NULL SET @backup_set_id_end = 999999999
|
||||
|
||||
SELECT backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' FROM DISK = ''' + mf.physical_device_name + ''' WITH NORECOVERY'
|
||||
FROM msdb.dbo.backupset b,
|
||||
msdb.dbo.backupmediafamily mf
|
||||
WHERE b.media_set_id = mf.media_set_id
|
||||
AND b.database_name = @databaseName
|
||||
AND b.backup_set_id = @backup_set_id_start
|
||||
UNION
|
||||
SELECT backup_set_id, 'RESTORE LOG ' + @databaseName + ' FROM DISK = ''' + mf.physical_device_name + ''' WITH NORECOVERY'
|
||||
FROM msdb.dbo.backupset b,
|
||||
msdb.dbo.backupmediafamily mf
|
||||
WHERE b.media_set_id = mf.media_set_id
|
||||
AND b.database_name = @databaseName
|
||||
AND b.backup_set_id >= @backup_set_id_start AND b.backup_set_id < @backup_set_id_end
|
||||
AND b.type = 'L'
|
||||
UNION
|
||||
SELECT 999999999 AS backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' WITH RECOVERY'
|
||||
ORDER BY backup_set_id
|
||||
@@ -0,0 +1,3 @@
|
||||
# Wstęp
|
||||
|
||||
- sex_guest_account_check - są skryptami sprawdzającymi jakie upbrawnienia mają uzytkownicy w poszczególnych bazach danycj, skrypty nie modyfikują żadnych danych.
|
||||
@@ -0,0 +1,135 @@
|
||||
USE master
|
||||
GO
|
||||
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
|
||||
DROP PROCEDURE sp_hexadecimal
|
||||
GO
|
||||
CREATE PROCEDURE sp_hexadecimal
|
||||
@binvalue varbinary(256),
|
||||
@hexvalue varchar (514) OUTPUT
|
||||
AS
|
||||
DECLARE @charvalue varchar (514)
|
||||
DECLARE @i int
|
||||
DECLARE @length int
|
||||
DECLARE @hexstring char(16)
|
||||
SELECT @charvalue = '0x'
|
||||
SELECT @i = 1
|
||||
SELECT @length = DATALENGTH (@binvalue)
|
||||
SELECT @hexstring = '0123456789ABCDEF'
|
||||
WHILE (@i <= @length)
|
||||
BEGIN
|
||||
DECLARE @tempint int
|
||||
DECLARE @firstint int
|
||||
DECLARE @secondint int
|
||||
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
|
||||
SELECT @firstint = FLOOR(@tempint/16)
|
||||
SELECT @secondint = @tempint - (@firstint*16)
|
||||
SELECT @charvalue = @charvalue +
|
||||
SUBSTRING(@hexstring, @firstint+1, 1) +
|
||||
SUBSTRING(@hexstring, @secondint+1, 1)
|
||||
SELECT @i = @i + 1
|
||||
END
|
||||
|
||||
SELECT @hexvalue = @charvalue
|
||||
GO
|
||||
|
||||
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
|
||||
DROP PROCEDURE sp_help_revlogin
|
||||
GO
|
||||
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
|
||||
DECLARE @name sysname
|
||||
DECLARE @type varchar (1)
|
||||
DECLARE @hasaccess int
|
||||
DECLARE @denylogin int
|
||||
DECLARE @is_disabled int
|
||||
DECLARE @PWD_varbinary varbinary (256)
|
||||
DECLARE @PWD_string varchar (514)
|
||||
DECLARE @SID_varbinary varbinary (85)
|
||||
DECLARE @SID_string varchar (514)
|
||||
DECLARE @tmpstr varchar (1024)
|
||||
DECLARE @is_policy_checked varchar (3)
|
||||
DECLARE @is_expiration_checked varchar (3)
|
||||
|
||||
DECLARE @defaultdb sysname
|
||||
|
||||
IF (@login_name IS NULL)
|
||||
DECLARE login_curs CURSOR FOR
|
||||
|
||||
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
|
||||
sys.server_principals p LEFT JOIN sys.syslogins l
|
||||
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
|
||||
ELSE
|
||||
DECLARE login_curs CURSOR FOR
|
||||
|
||||
|
||||
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
|
||||
sys.server_principals p LEFT JOIN sys.syslogins l
|
||||
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
|
||||
OPEN login_curs
|
||||
|
||||
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
|
||||
IF (@@fetch_status = -1)
|
||||
BEGIN
|
||||
PRINT 'No login(s) found.'
|
||||
CLOSE login_curs
|
||||
DEALLOCATE login_curs
|
||||
RETURN -1
|
||||
END
|
||||
SET @tmpstr = '/* sp_help_revlogin script '
|
||||
PRINT @tmpstr
|
||||
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
|
||||
PRINT @tmpstr
|
||||
PRINT ''
|
||||
WHILE (@@fetch_status <> -1)
|
||||
BEGIN
|
||||
IF (@@fetch_status <> -2)
|
||||
BEGIN
|
||||
PRINT ''
|
||||
SET @tmpstr = '-- Login: ' + @name
|
||||
PRINT @tmpstr
|
||||
IF (@type IN ( 'G', 'U'))
|
||||
BEGIN -- NT authenticated account/group
|
||||
|
||||
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
|
||||
END
|
||||
ELSE BEGIN -- SQL Server authentication
|
||||
-- obtain password and sid
|
||||
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
|
||||
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
|
||||
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
|
||||
|
||||
-- obtain password policy state
|
||||
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
|
||||
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
|
||||
|
||||
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
|
||||
|
||||
IF ( @is_policy_checked IS NOT NULL )
|
||||
BEGIN
|
||||
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
|
||||
END
|
||||
IF ( @is_expiration_checked IS NOT NULL )
|
||||
BEGIN
|
||||
SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
|
||||
END
|
||||
END
|
||||
IF (@denylogin = 1)
|
||||
BEGIN -- login is denied access
|
||||
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
|
||||
END
|
||||
ELSE IF (@hasaccess = 0)
|
||||
BEGIN -- login exists but does not have access
|
||||
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
|
||||
END
|
||||
IF (@is_disabled = 1)
|
||||
BEGIN -- login is disabled
|
||||
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
|
||||
END
|
||||
PRINT @tmpstr
|
||||
END
|
||||
|
||||
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
|
||||
END
|
||||
CLOSE login_curs
|
||||
DEALLOCATE login_curs
|
||||
RETURN 0
|
||||
GO
|
||||
@@ -0,0 +1,316 @@
|
||||
set nocount off
|
||||
|
||||
IF OBJECT_ID(N'tempdb..##temp1') IS NOT NULL
|
||||
DROP TABLE ##temp1
|
||||
|
||||
create table ##temp1(query varchar(1000))
|
||||
|
||||
insert into ##temp1
|
||||
select 'use '+db_name() +';'
|
||||
|
||||
insert into ##temp1
|
||||
select 'go'
|
||||
|
||||
/*creating database roles*/
|
||||
insert into ##temp1
|
||||
select 'if DATABASE_PRINCIPAL_ID('''+name+''') is null
|
||||
exec sp_addrole '''+name+'''' from sysusers
|
||||
where issqlrole = 1 and (sid is not null and sid <> 0x0)
|
||||
|
||||
/*creating application roles*/
|
||||
insert into ##temp1
|
||||
select 'if DATABASE_PRINCIPAL_ID('+char(39)+name+char(39)+')
|
||||
is null CREATE APPLICATION ROLE ['+name+'] WITH DEFAULT_SCHEMA = ['+
|
||||
default_schema_name+'], Password='+char(39)+'Pass$w0rd123'+char(39)+' ;'
|
||||
from sys.database_principals
|
||||
where type_desc='APPLICATION_ROLE'
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' to '+'['+USER_NAME(grantee_principal_id)+']'+' WITH GRANT OPTION ;'
|
||||
|
||||
else
|
||||
state_desc+' '+permission_name+' to '+'['+USER_NAME(grantee_principal_id)+']'+' ;'
|
||||
END
|
||||
from sys.database_permissions
|
||||
where class=0 and USER_NAME(grantee_principal_id) not in ('dbo','guest','sys','information_schema')
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' on '+OBJECT_SCHEMA_NAME(major_id)+'.['+OBJECT_NAME(major_id)
|
||||
+'] to '+'['+USER_NAME(grantee_principal_id)+']'+' with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' on '+OBJECT_SCHEMA_NAME(major_id)+'.['+OBJECT_NAME(major_id)
|
||||
+'] to '+'['+USER_NAME(grantee_principal_id)+']'+' ;'
|
||||
end
|
||||
from sys.database_permissions where class=1 and USER_NAME(grantee_principal_id) not in ('public');
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON schema::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON schema::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.schemas sa on
|
||||
sa.schema_id = dp.major_id where dp.class=3
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON APPLICATION ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON APPLICATION ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.database_principals sa on
|
||||
sa.principal_id = dp.major_id where dp.class=4 and sa.type='A'
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON ROLE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join
|
||||
sys.database_principals sa on sa.principal_id = dp.major_id
|
||||
where dp.class=4 and sa.type='R'
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON ASSEMBLY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON ASSEMBLY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.assemblies sa on
|
||||
sa.assembly_id = dp.major_id
|
||||
where dp.class=5
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON type::['
|
||||
+SCHEMA_NAME(schema_id)+'].['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON type::['
|
||||
+SCHEMA_NAME(schema_id)+'].['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.types sa on
|
||||
sa.user_type_id = dp.major_id
|
||||
where dp.class=6
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON XML SCHEMA COLLECTION::['+
|
||||
SCHEMA_NAME(SCHEMA_ID)+'].['+sa.name+'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON XML SCHEMA COLLECTION::['+
|
||||
SCHEMA_NAME(SCHEMA_ID)+'].['+sa.name+'] to ['+user_name(dp.grantee_principal_id)+'];'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.xml_schema_collections sa on
|
||||
sa.xml_collection_id = dp.major_id
|
||||
where dp.class=10
|
||||
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON message type::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON message type::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.service_message_types sa on
|
||||
sa.message_type_id = dp.major_id
|
||||
where dp.class=15
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON contract::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON contract::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.service_contracts sa on
|
||||
sa.service_contract_id = dp.major_id
|
||||
where dp.class=16
|
||||
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON SERVICE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON SERVICE::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.services sa on
|
||||
sa.service_id = dp.major_id
|
||||
where dp.class=17
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON REMOTE SERVICE BINDING::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON REMOTE SERVICE BINDING::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.remote_service_bindings sa on
|
||||
sa.remote_service_binding_id = dp.major_id
|
||||
where dp.class=18
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON route::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON route::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.routes sa on
|
||||
sa.route_id = dp.major_id
|
||||
where dp.class=19
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON FULLTEXT CATALOG::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON FULLTEXT CATALOG::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.fulltext_catalogs sa on
|
||||
sa.fulltext_catalog_id = dp.major_id
|
||||
where dp.class=23
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON SYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON SYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.symmetric_keys sa on
|
||||
sa.symmetric_key_id = dp.major_id
|
||||
where dp.class=24
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON certificate::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON certificate::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.certificates sa on
|
||||
sa.certificate_id = dp.major_id
|
||||
where dp.class=25
|
||||
|
||||
|
||||
insert into ##temp1
|
||||
select
|
||||
case
|
||||
when state_desc='GRANT_WITH_GRANT_OPTION'
|
||||
then
|
||||
substring (state_desc,0,6)+' '+permission_name+' ON ASYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] with grant option ;'
|
||||
else
|
||||
state_desc+' '+permission_name+' ON ASYMMETRIC KEY::['+sa.name+
|
||||
'] to ['+user_name(dp.grantee_principal_id)+'] ;'
|
||||
COLLATE LATIN1_General_CI_AS
|
||||
end
|
||||
from sys.database_permissions dp inner join sys.asymmetric_keys sa on
|
||||
sa.asymmetric_key_id = dp.major_id
|
||||
where dp.class=26
|
||||
|
||||
insert into ##temp1
|
||||
select 'exec sp_addrolemember ''' +p.NAME+''','+'['+m.NAME+']'+' ;'
|
||||
FROM sys.database_role_members rm
|
||||
JOIN sys.database_principals p
|
||||
ON rm.role_principal_id = p.principal_id
|
||||
JOIN sys.database_principals m
|
||||
ON rm.member_principal_id = m.principal_id
|
||||
where m.name not like 'dbo';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
select * from ##temp1
|
||||
@@ -0,0 +1,41 @@
|
||||
--guest users
|
||||
USE master;
|
||||
GO
|
||||
if not exists (select name from sys.databases where name = 'SQLAdmin')
|
||||
create database SQLAdmin
|
||||
go
|
||||
declare @name sysname
|
||||
declare @cmd varchar(4000)
|
||||
DECLARE databases_cursor CURSOR FOR
|
||||
SELECT name FROM sys.databases where state in (0)
|
||||
order by name
|
||||
|
||||
create table #guest_users (
|
||||
database_name sysname, principal_name sysname, permission_name nvarchar(128), state_desc nvarchar(6)
|
||||
)
|
||||
|
||||
OPEN databases_cursor;
|
||||
|
||||
FETCH NEXT FROM databases_cursor into @name;
|
||||
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
set @cmd = 'use ' + @name + ';
|
||||
insert into #guest_users
|
||||
SELECT ''' + @name + ''' as database_name, name, permission_name, state_desc
|
||||
FROM sys.database_principals dpr
|
||||
INNER JOIN sys.database_permissions dpe
|
||||
ON dpr.principal_id = dpe.grantee_principal_id
|
||||
WHERE name = ''guest'' AND permission_name = ''CONNECT''
|
||||
'
|
||||
exec (@cmd)
|
||||
FETCH NEXT FROM databases_cursor into @name;
|
||||
END
|
||||
|
||||
select * from #guest_users order by database_name asc
|
||||
|
||||
drop table #guest_users
|
||||
|
||||
CLOSE databases_cursor;
|
||||
DEALLOCATE databases_cursor;
|
||||
GO
|
||||
@@ -0,0 +1,25 @@
|
||||
SET NOCOUNT ON
|
||||
GO
|
||||
DECLARE @DBName VARCHAR(255)
|
||||
DECLARE @SQL VARCHAR(MAX)
|
||||
DECLARE @SQLEXEC VARCHAR(MAX)
|
||||
CREATE TABLE #TableVar (DatabaseName varchar(256), permission_name varchar(32), State_desc varchar(10))
|
||||
DECLARE curDatabases CURSOR STATIC FOR
|
||||
SELECT [name]
|
||||
FROM master.sys.databases
|
||||
WHERE database_id > 4
|
||||
ORDER BY [name]
|
||||
OPEN curDatabases
|
||||
FETCH NEXT FROM curDatabases INTO @DBName
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
SET @SQL = 'insert into #TableVar SELECT DB_NAME() as DatabaseName,permission_name,state_desc FROM sys.database_permissions where grantee_principal_id = user_id(''''guest'''') AND state = ''''G'''' AND type = ''''CO'''' '
|
||||
SET @SQLEXEC = 'USE ' + QUOTENAME(@DBName) + ';EXEC (''' + @SQL +''')'
|
||||
EXEC(@SQLEXEC)
|
||||
FETCH NEXT FROM curDatabases INTO @DBName
|
||||
END
|
||||
CLOSE curDatabases
|
||||
DEALLOCATE curDatabases
|
||||
Select * from #TableVar
|
||||
Drop table #TableVar
|
||||
GO
|
||||
@@ -0,0 +1,12 @@
|
||||
SELECT
|
||||
event_time ,
|
||||
session_server_principal_name AS UserName ,
|
||||
server_instance_name ,
|
||||
database_name ,
|
||||
object_name ,
|
||||
statement
|
||||
FROM sys.fn_get_audit_file('C:\AUDITs\*.sqlaudit', DEFAULT, DEFAULT)
|
||||
WHERE
|
||||
action_id = 'SL'
|
||||
AND
|
||||
database_name = 'ACMEDB';
|
||||
@@ -0,0 +1,34 @@
|
||||
SELECT
|
||||
DB_NAME(db.database_id) DatabaseName,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB,
|
||||
(CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB,
|
||||
(CAST(mfrows.RowSize AS FLOAT)*8)/1024/1024+(CAST(mflog.LogSize AS FLOAT)*8)/1024/1024 DBSizeG,
|
||||
(CAST(mfstream.StreamSize AS FLOAT)*8)/1024 StreamSizeMB,
|
||||
(CAST(mftext.TextIndexSize AS FLOAT)*8)/1024 TextIndexSizeMB
|
||||
FROM sys.databases db
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) RowSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 0
|
||||
GROUP BY database_id, type) mfrows
|
||||
ON mfrows.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) LogSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 1
|
||||
GROUP BY database_id, type) mflog
|
||||
ON mflog.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) StreamSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 2
|
||||
GROUP BY database_id, type) mfstream
|
||||
ON mfstream.database_id = db.database_id
|
||||
LEFT JOIN (SELECT database_id,
|
||||
SUM(size) TextIndexSize
|
||||
FROM sys.master_files
|
||||
WHERE type = 4
|
||||
GROUP BY database_id, type) mftext
|
||||
ON mftext.database_id = db.database_id
|
||||
ORDER BY 4 DESC
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
HostName name FileType PhysicalFile OnlineStatus type_desc FileSize SizeInBytes
|
||||
DESKTOP-NG9J589 DBATools DBATools C:\MSSQL\MSSQL14.MSSQLSERVER\MSSQL\DATA\DBATools.mdf ONLINE ROWS 8 MB 8192 Bytes
|
||||
**/
|
||||
|
||||
SELECT
|
||||
serverproperty('ComputerNamePhysicalNetBIOS') as HostName,
|
||||
D.name,
|
||||
F.Name AS FileType,
|
||||
F.physical_name AS PhysicalFile,
|
||||
F.state_desc AS OnlineStatus,
|
||||
type_desc,
|
||||
CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize,
|
||||
CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes
|
||||
FROM
|
||||
sys.master_files F
|
||||
INNER JOIN sys.databases D ON D.database_id = F.database_id
|
||||
ORDER BY
|
||||
D.name
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
|
||||
SELECT
|
||||
DB.name,
|
||||
SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB,
|
||||
SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB
|
||||
FROM
|
||||
sys.master_files MF
|
||||
JOIN sys.databases DB ON DB.database_id = MF.database_id
|
||||
GROUP BY DB.name
|
||||
ORDER BY DataFileSizeMB DESC
|
||||
|
||||
|
||||
|
||||
SELECT
|
||||
D.name,
|
||||
F.Name AS FileType,
|
||||
F.physical_name AS PhysicalFile,
|
||||
F.state_desc AS OnlineStatus,
|
||||
CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize,
|
||||
CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes
|
||||
FROM
|
||||
sys.master_files F
|
||||
INNER JOIN sys.databases D ON D.database_id = F.database_id
|
||||
ORDER BY
|
||||
D.name
|
||||
@@ -0,0 +1,15 @@
|
||||
SELECT Drive
|
||||
, TotalSpaceGB
|
||||
, FreeSpaceGB
|
||||
, PctFree
|
||||
, PctFreeExact
|
||||
FROM
|
||||
(SELECT DISTINCT
|
||||
SUBSTRING(dovs.volume_mount_point, 1, 10) AS Drive
|
||||
, CONVERT(INT, dovs.total_bytes / 1024.0 / 1024.0 / 1024.0) AS TotalSpaceGB
|
||||
, CONVERT(INT, dovs.available_bytes / 1048576.0) / 1024 AS FreeSpaceGB
|
||||
, CAST(ROUND(( CONVERT(FLOAT, dovs.available_bytes / 1048576.0) / CONVERT(FLOAT, dovs.total_bytes / 1024.0 /
|
||||
1024.0) * 100 ), 2) AS NVARCHAR(50)) + '%' AS PctFree
|
||||
, CONVERT(FLOAT, dovs.available_bytes / 1048576.0) / CONVERT(FLOAT, dovs.total_bytes / 1024.0 / 1024.0) * 100 AS PctFreeExact
|
||||
FROM sys.master_files AS mf
|
||||
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) AS dovs) AS DE
|
||||
@@ -0,0 +1,13 @@
|
||||
SELECT
|
||||
serverproperty(N'ServerName') as [ServerName],
|
||||
serverproperty(N'InstanceName') as [InstanceName],
|
||||
DB.name,
|
||||
SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB,
|
||||
SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB
|
||||
FROM
|
||||
sys.master_files MF
|
||||
JOIN sys.databases DB ON DB.database_id = MF.database_id
|
||||
GROUP BY DB.name
|
||||
ORDER BY DataFileSizeMB DESC
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
W tym miejscu będziw wszystko co może dotyczyć przestrzeni temporarnej
|
||||
@@ -0,0 +1,28 @@
|
||||
--Tempdb session File usage
|
||||
--sys.dm_db_session_space_usage : Returns the number of pages allocated and deallocated by each session for the database.
|
||||
--sys.dm_exec_sessions: Gives details about the sessions.
|
||||
|
||||
SELECT
|
||||
sys.dm_exec_sessions.session_id AS [SESSION ID],
|
||||
db_name(sys.dm_db_session_space_usage.database_id) AS [DATABASE Name],
|
||||
HOST_NAME AS [System Name],
|
||||
program_name AS [Program Name],
|
||||
login_name AS [USER Name],
|
||||
status,
|
||||
cpu_time AS [CPU TIME (in milisec)],
|
||||
total_scheduled_time AS [Total Scheduled TIME (in milisec)],
|
||||
total_elapsed_time AS [Elapsed TIME (in milisec)],
|
||||
(memory_usage * 8) AS [Memory USAGE (in KB)],
|
||||
(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)],
|
||||
(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)],
|
||||
(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)],
|
||||
(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)],
|
||||
CASE is_user_process
|
||||
WHEN 1 THEN 'user session'
|
||||
WHEN 0 THEN 'system session'
|
||||
END AS [SESSION Type], row_count AS [ROW COUNT]
|
||||
FROM sys.dm_db_session_space_usage
|
||||
INNER join
|
||||
sys.dm_exec_sessions
|
||||
ON sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
--A long running transaction may prevent cleanup of transaction log thus eating up all log space available resulting space crisis for all other applications.
|
||||
|
||||
SELECT
|
||||
transaction_id AS [Transacton ID],
|
||||
[name] AS [TRANSACTION Name],
|
||||
transaction_begin_time AS [TRANSACTION BEGIN TIME],
|
||||
DATEDIFF(mi, transaction_begin_time, GETDATE()) AS [Elapsed TIME (in MIN)],
|
||||
CASE transaction_type
|
||||
WHEN 1 THEN 'Read/write'
|
||||
WHEN 2 THEN 'Read-only'
|
||||
WHEN 3 THEN 'System'
|
||||
WHEN 4 THEN 'Distributed'
|
||||
END AS [TRANSACTION Type],
|
||||
CASE transaction_state
|
||||
WHEN 0 THEN 'The transaction has not been completely initialized yet.'
|
||||
WHEN 1 THEN 'The transaction has been initialized but has not started.'
|
||||
WHEN 2 THEN 'The transaction is active.'
|
||||
WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
|
||||
WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
|
||||
WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
|
||||
WHEN 6 THEN 'The transaction has been committed.'
|
||||
WHEN 7 THEN 'The transaction is being rolled back.'
|
||||
WHEN 8 THEN 'The transaction has been rolled back.'
|
||||
END AS [TRANSACTION Description]
|
||||
FROM sys.dm_tran_active_transactions
|
||||
@@ -0,0 +1,30 @@
|
||||
--Long running Queries
|
||||
|
||||
-- sys.dm_exec_requests : Returns information regarding the requests made to the database server.
|
||||
|
||||
SELECT
|
||||
HOST_NAME AS [System Name],
|
||||
program_name AS [Application Name],
|
||||
DB_NAME(sys.dm_exec_sessions.database_id) AS [DATABASE Name],
|
||||
USER_NAME(USER_ID) AS [USER Name],
|
||||
connection_id AS [CONNECTION ID],
|
||||
sys.dm_exec_requests.session_id AS [CURRENT SESSION ID],
|
||||
blocking_session_id AS [Blocking SESSION ID],
|
||||
start_time AS [Request START TIME],
|
||||
sys.dm_exec_requests.status AS [Status],
|
||||
command AS [Command Type],
|
||||
(SELECT TEXT FROM sys.dm_exec_sql_text(sql_handle)) AS [Query TEXT],
|
||||
wait_type AS [Waiting Type],
|
||||
wait_time AS [Waiting Duration],
|
||||
wait_resource AS [Waiting FOR Resource],
|
||||
sys.dm_exec_requests.transaction_id AS [TRANSACTION ID],
|
||||
percent_complete AS [PERCENT Completed],
|
||||
estimated_completion_time AS [Estimated COMPLETION TIME (in mili sec)],
|
||||
sys.dm_exec_requests.cpu_time AS [CPU TIME used (in mili sec)],
|
||||
(memory_usage * 8) AS [Memory USAGE (in KB)],
|
||||
sys.dm_exec_requests.total_elapsed_time AS [Elapsed TIME (in mili sec)]
|
||||
FROM sys.dm_exec_requests
|
||||
INNER join
|
||||
sys.dm_exec_sessions
|
||||
ON sys.dm_exec_requests.session_id = sys.dm_exec_sessions.session_id
|
||||
WHERE DB_NAME(sys.dm_exec_sessions.database_id) = 'tempdb'
|
||||
@@ -0,0 +1,38 @@
|
||||
-- Determining the Amount of Free Space in tempdb
|
||||
SELECT SUM(unallocated_extent_page_count) AS [free pages],
|
||||
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
|
||||
FROM sys.dm_db_file_space_usage;
|
||||
|
||||
-- Determining the Amount Space Used by the Version Store
|
||||
SELECT SUM(version_store_reserved_page_count) AS [version store pages used],
|
||||
(SUM(version_store_reserved_page_count)*1.0/128) AS [version store space in MB]
|
||||
FROM sys.dm_db_file_space_usage;
|
||||
|
||||
-- Determining the Amount of Space Used by Internal Objects
|
||||
SELECT SUM(internal_object_reserved_page_count) AS [internal object pages used],
|
||||
(SUM(internal_object_reserved_page_count)*1.0/128) AS [internal object space in MB]
|
||||
FROM sys.dm_db_file_space_usage;
|
||||
|
||||
-- Determining the Amount of Space Used by User Objects
|
||||
SELECT SUM(user_object_reserved_page_count) AS [user object pages used],
|
||||
(SUM(user_object_reserved_page_count)*1.0/128) AS [user object space in MB]
|
||||
FROM sys.dm_db_file_space_usage;
|
||||
|
||||
-- Obtaining the space consumed by internal objects in all currently running tasks in each session
|
||||
SELECT session_id,
|
||||
SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
|
||||
SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
|
||||
FROM sys.dm_db_task_space_usage
|
||||
GROUP BY session_id;
|
||||
|
||||
|
||||
-- Obtaining the space consumed by internal objects in the current session for both running and completed tasks
|
||||
SELECT R2.session_id,
|
||||
R1.internal_objects_alloc_page_count
|
||||
+ SUM(R2.internal_objects_alloc_page_count) AS session_internal_objects_alloc_page_count,
|
||||
R1.internal_objects_dealloc_page_count
|
||||
+ SUM(R2.internal_objects_dealloc_page_count) AS session_internal_objects_dealloc_page_count
|
||||
FROM sys.dm_db_session_space_usage AS R1
|
||||
INNER JOIN sys.dm_db_task_space_usage AS R2 ON R1.session_id = R2.session_id
|
||||
GROUP BY R2.session_id, R1.internal_objects_alloc_page_count,
|
||||
R1.internal_objects_dealloc_page_count;;
|
||||
@@ -0,0 +1,19 @@
|
||||
-- To check current tempdb size and growth parameters, use the following query:
|
||||
SELECT name AS FileName,
|
||||
size*1.0/128 AS FileSizeinMB,
|
||||
CASE max_size
|
||||
WHEN 0 THEN 'Autogrowth is off.'
|
||||
WHEN -1 THEN 'Autogrowth is on.'
|
||||
ELSE 'Log file grows to a maximum size of 2 TB.'
|
||||
END,
|
||||
growth AS 'GrowthValue',
|
||||
'GrowthIncrement' =
|
||||
CASE
|
||||
WHEN growth = 0 THEN 'Size is fixed.'
|
||||
WHEN growth > 0 AND is_percent_growth = 0
|
||||
THEN 'Growth value is in 8-KB pages.'
|
||||
ELSE 'Growth value is a percentage.'
|
||||
END
|
||||
FROM tempdb.sys.database_files;
|
||||
GO
|
||||
|
||||
Reference in New Issue
Block a user