May 17, 2026, 11:40 PM

This commit is contained in:
Paweł Domański
2026-05-18 06:40:19 +00:00
commit 64944cf004
896 changed files with 310709 additions and 0 deletions
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
+190
View File
@@ -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: Whats 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: Whats 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/
+15
View File
@@ -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
+13
View File
@@ -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())
+132
View File
@@ -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'
+49
View File
@@ -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
+56
View File
@@ -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
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
+46
View File
@@ -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;
+22
View File
@@ -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
+21
View File
@@ -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
+23
View File
@@ -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
+94
View File
@@ -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
+36
View File
@@ -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;
+23
View File
@@ -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' )
+5
View File
@@ -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
+109
View File
@@ -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)
+243
View File
@@ -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
+3
View File
@@ -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
+13
View File
@@ -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
+1
View File
@@ -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