Get Job name when you are executing job. This is useful when you need to make reference to the job being executed.
DECLARE @jobname sysname, @jobid uniqueidentifier
SELECT @jobname=b.name,@jobid=b.job_id
FROM sys.dm_exec_sessions a,msdb.dbo.sysjobs b
WHERE a.session_id=@@spid
AND
(SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(a.PROGRAM_NAME,30,10)
PRINT 'Job Name : ' + @jobname
Instead, you can Use Tokens in Job Steps.
https://docs.microsoft.com/en-us/sql/ssms/agent/use-tokens-in-job-steps
PRINT 'Job Name : '+'$(ESCAPE_SQUOTE(JOBNAME))'
PRINT 'Step Name : '+'$(ESCAPE_SQUOTE(STEPNAME))'
Query lists all table (and view) constraints - primary keys, unique key constraints and indexes, foreign keys and check, default constraints, and isDisabled.
Columns
- SchemaName
- Name - table or view schema and name
- object_type - object type:
- constraint_type - type of constraint:
- Primary key
- Unique key
- Foregin key
- Check constraint
- Default constraint
- constraint_name - name of constraint or index
- details - details of this constraint:
- Primary key - PK column(s)
- Unique key - UK column(s)
- Foregin key - parent table name
- Check constraint - check definition
- Default constraint - column name and default value definition
- IsDisable – it is disabled or not.
SELECT SchemaName
,[Name]
,object_type
,constraint_type
,constraint_name
,details
,IsDisabled
FROM (
-- Index
SELECT SCHEMA_NAME(t.schema_id) AS SchemaName
,t.[name] AS [Name]
,CASE
WHEN t.[type] = 'U'
THEN 'Table'
WHEN t.[type] = 'V'
THEN 'View'
END AS [object_type]
,CASE
WHEN c.[type] = 'PK'
THEN 'Primary key'
WHEN c.[type] = 'UQ'
THEN 'Unique constraint'
WHEN i.[type] = 1
THEN 'Unique clustered index'
WHEN i.type = 2
THEN 'Unique index'
END AS constraint_type
,ISNULL(c.[name], i.[name]) AS constraint_name
,SUBSTRING(column_names, 1, LEN(column_names) - 1) AS [details]
,i.is_disabled AS IsDisabled
FROM sys.objects t
LEFT OUTER JOIN sys.indexes i ON t.object_id = i.object_id
LEFT OUTER JOIN sys.key_constraints c ON i.object_id = c.parent_object_id
AND i.index_id = c.unique_index_id
CROSS APPLY (
SELECT col.[name] + ', '
FROM sys.index_columns ic
INNER JOIN sys.columns col ON ic.object_id = col.object_id
AND ic.column_id = col.column_id
WHERE ic.object_id = t.object_id
AND ic.index_id = i.index_id
ORDER BY col.column_id
FOR XML PATH('')
) D(column_names)
WHERE is_unique = 1
AND t.is_ms_shipped <> 1
UNION ALL
-- Foreign key
SELECT SCHEMA_NAME(fk_tab.schema_id)
,fk_tab.NAME AS foreign_table
,'Table'
,'Foreign key'
,fk.NAME AS fk_constraint_name
,SCHEMA_NAME(pk_tab.schema_id) + '.' + pk_tab.NAME
,fk.is_disabled AS IsDisabled
FROM sys.foreign_keys fk
INNER JOIN sys.tables fk_tab ON fk_tab.object_id = fk.parent_object_id
INNER JOIN sys.tables pk_tab ON pk_tab.object_id = fk.referenced_object_id
INNER JOIN sys.foreign_key_columns fk_cols ON fk_cols.constraint_object_id = fk.object_id
UNION ALL
-- Check constraint
SELECT SCHEMA_NAME(t.schema_id)
,t.[name]
,'Table'
,'Check constraint'
,con.[name] AS constraint_name
,con.[definition]
,con.is_disabled AS IsDisabled
FROM sys.check_constraints con
LEFT OUTER JOIN sys.objects t ON con.parent_object_id = t.object_id
LEFT OUTER JOIN sys.all_columns col ON con.parent_column_id = col.column_id
AND con.parent_object_id = col.object_id
UNION ALL
-- Default constraint
SELECT SCHEMA_NAME(t.schema_id)
,t.[name]
,'Table'
,'Default constraint'
,con.[name]
,col.[name] + ' = ' + con.[definition]
,0 AS IsDisabled
FROM sys.default_constraints con
LEFT OUTER JOIN sys.objects t ON con.parent_object_id = t.object_id
LEFT OUTER JOIN sys.all_columns col ON con.parent_column_id = col.column_id
AND con.parent_object_id = col.object_id
) a
ORDER BY SchemaName
,[Name]
,constraint_type
,constraint_name;
Script to set nocheck on foreign key constaints
-- Script to set nocheck on foreign key constaints
DECLARE @SchemaName VARCHAR(250) = NULL; -- 'dbo';
DECLARE @TableName VARCHAR(250) = NULL; -- 'Client';
DECLARE @IDKey INT;
DECLARE @SqlScript VARCHAR(max);
SET NOCOUNT ON;
DROP TABLE IF EXISTS #tb;
-- Foreign key
SELECT ROW_NUMBER() OVER(ORDER BY SCHEMA_NAME(fk_tab.schema_id), fk_tab.NAME) AS [IDKey],
--SCHEMA_NAME(fk_tab.schema_id),
--fk_tab.NAME AS foreign_table,
--fk.NAME AS fk_constraint_name,
--SCHEMA_NAME(pk_tab.schema_id) + '.' + pk_tab.NAME,
--fk.is_disabled AS IsDisabled,
'ALTER TABLE [' + SCHEMA_NAME(fk_tab.schema_id) + '].[' + fk_tab.NAME + '] NOCHECK CONSTRAINT ' + fk.NAME + ';' AS SqlScript
INTO #tb
FROM sys.foreign_keys fk
INNER JOIN sys.tables fk_tab ON fk_tab.object_id = fk.parent_object_id
INNER JOIN sys.tables pk_tab ON pk_tab.object_id = fk.referenced_object_id
INNER JOIN sys.foreign_key_columns fk_cols ON fk_cols.constraint_object_id = fk.object_id
WHERE fk.is_disabled = 0
AND (@SchemaName IS NULL OR @SchemaName = SCHEMA_NAME(fk_tab.schema_id))
AND (@TableName IS NULL OR @TableName = fk_tab.NAME)
;
while ((SELECT COUNT(*) FROM #tb) > 0 )
BEGIN
SELECT top 1 @IDKey=IDKey, @SqlScript = SqlScript FROM #tb ORDER BY IDKey;
DELETE FROM #tb WHERE @IDKey=IDKey;
PRINT @SqlScript;
--EXEC(@SqlScript);
END;
This Stored procedure send a file by FTP.
Check if SQL Agent has access to the file and FTP server.
The little trick is to create a file that will run. It can have conflicts easily because filename is always the same. Next version will be with random name.
Use this code carefully, it is not 100% safe.
USE master;
PRINT '-- Server name: '+@@servername
IF EXISTS (
SELECT *
FROM sysobjects
WHERE id = object_id(N'[dbo].[sp_FtpSendFile]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1
)
DROP PROCEDURE [dbo].[sp_FtpSendFile]
GO
/************************************************************
Description : Send a file by FTP
@FTPServer The host name. ftp.example.com
@FTPUser The username for the FTP site.
@FTPPWD The password for the FTP site.
@FTPPath The ftp subfolder within the FTP site to place the file. Make sure to use forward slashes and leave a trailing slash.
@FTPFileName (optional) The filename to write within FTP. Typically the same as the source file name.
@FTPPASV (optional) Use passive mode
@SourcePath The local path to the directory that contains the source file. Make sure to have a trailing slash. c:\MyLocalPath\
@SourceFile The local source file to ftp.
@workdir (optional) The working local directory. This is where the stored proc will temporarily write a command file containing the FTP commands it will execute. = %TEMP%
*************************************************************/
CREATE PROCEDURE sp_FtpSendFile
-- Remote
@FTPServer VARCHAR(128)
,@FTPUser VARCHAR(128)
,@FTPPWD VARCHAR(128)
,@FTPPath VARCHAR(128)
,@FTPFileName VARCHAR(128) = NULL -- (optional)
,@FTPPASV INT = 1 -- (optional)
-- Local
,@SourcePath VARCHAR(128)
,@SourceFile VARCHAR(128)
,@workdir VARCHAR(128) = '%TEMP%' -- (optional)
-- debug
,@debug int = 0 -- (optional)
AS
BEGIN
/*
-- sandbox
DECLARE
@FTPServer VARCHAR(128)
,@FTPUser VARCHAR(128) = ''
,@FTPPWD VARCHAR(128)
,@FTPPath VARCHAR(128)
,@FTPFileName VARCHAR(128) = NULL -- (optional)
,@FTPPASV INT = 1 -- (optional)
,@SourcePath VARCHAR(128)
,@SourceFile VARCHAR(128)
,@workdir VARCHAR(128) = '%TEMP%' -- (optional)
,@debug int = 0
SELECT
@FTPServer = 'ftp.mysite.com' ,
@FTPUser = 'myusername' ,
@FTPPWD = 'mypassword' ,
@FTPPath = '/' ,
@SourcePath = 'K:\temp\Backup\' ,
@SourceFile = 'myFile.bak' ,
@debug = 0
*/
SET nocount on
DECLARE @cmd VARCHAR(1000)
DECLARE @workfilename VARCHAR(128)
DECLARE @noNull table (r NVARCHAR(MAX))
SET @workfilename = @workdir + 'ftpcmd.txt'
-- deal with special characters for echo commands
SET @FTPServer = replace(replace(replace(@FTPServer, '|', '^|'), '<', '^<'), '>', '^>')
SET @FTPUser = replace(replace(replace(@FTPUser, '|', '^|'), '<', '^<'), '>', '^>')
SET @FTPPWD = replace(replace(replace(@FTPPWD, '|', '^|'), '<', '^<'), '>', '^>')
SET @FTPPath = replace(replace(replace(@FTPPath, '|', '^|'), '<', '^<'), '>', '^>')
SET @cmd = 'echo open ' + @FTPServer + ' > ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo ' + @FTPUser + '>> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo ' + @FTPPWD + '>> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
IF (@FTPPASV = 1)
BEGIN
SET @cmd = 'echo quote PASV >> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
END
SET @cmd = 'echo cd '+ @FTPPath + '>> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo binary >> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo put ' + @SourcePath + @SourceFile + ' ' + ISNULL(@FTPFileName, '') + ' >> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo dir ' + ISNULL(@FTPFileName, @SourceFile) + ' >> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'echo quit' + ' >> ' + @workfilename
INSERT @noNull EXEC master..xp_cmdshell @cmd
SET @cmd = 'ftp -s:' + @workfilename
DECLARE @a TABLE (
id INT identity(1, 1)
,s VARCHAR(1000)
);
IF (@debug = 1)
BEGIN
SET @cmd = 'TYPE ' + @workfilename
EXEC master..xp_cmdshell @cmd
END
ELSE
BEGIN
INSERT @a EXEC master..xp_cmdshell @cmd;
SELECT id, ouputtmp = s
FROM @a;
END
END
GO
Step by step how you can change 'root' password
You must have rights to stop/start services, and kill process.
Step 1: Stop MySql service
run: services.msc
...
Step 2 : Create file to reset password
You can use your password and your file name.
We use password : Pass1Word2
and file name : C:\temp\reset.txt
USE mysql;
UPDATE mysql.user SET Password=PASSWORD('Pass!Word@') WHERE User='root';
FLUSH PRIVILEGES;
Step 3 : Find our my.ini file
It is usually locate on 'C:\ProgramData\MySQL\MySQL Server ????\my.ini'
But, you can try to find using :
C:\
dir my.ini /s /b
You can check MySQL service's property.
...
For this sample, we use this:
C:\ProgramData\MySQL\MySQL Server 5.5\my.ini
Step 4 : Navigate to MySql bin directory
Open command prompt there.
...
Type command :
mysqld --defaults-file="C:\\ProgramData\\MySQL\\MySQL Server 5.5\\my.ini" --init-file=C:\temp\reset.txt
Attention : Use double "\\" insted "\"
Step 5 : Open "Task Manager" and kill process "mysqld.exe"
Step 6: Start service "MySql"
By now, we have a new password.
cls
@echo off
cls
echo.
echo * * * Reset MySql password * * *
echo.
pause
echo.
echo Stop MySql Service
echo.
sc stop MySql
echo.
pause
echo.
echo Kill mysqld.exe
echo.
taskkill -f -im mysqld.exe
echo.
pause
echo.
rem dir "C:\ProgramData\MySQL\MySQL Server 5.5\my.ini"
echo.
echo Run MySqlD
echo.
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.5\my.ini" --init-file=C:\Temp\reset.txt
echo.
pause
echo.
echo Start MySql Service
echo.
sc start MySql
echo.
pause
echo.
echo Try to connect
echo.
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe" "--defaults-file=C:\Program Files\MySQL\MySQL Server 5.5\my.ini" "-uroot" "-p"
echo.
cd\temp
echo.
** Attention : Make sure all file are ANSI
This code create a table to log all connections.
It is very simple, it just logs when, who, from where and which database.
For this we use “master.dbo.sysprocesses”
https://docs.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysprocesses-transact-sql?view=sql-server-2017
Create table to log on [Master] database.
USE [master] GO CREATE TABLE [dbo].[dbaLogAccess] ( [dbaLogAccessId] [int] IDENTITY (1, 1) NOT NULL , [ConnectionDate] [datetime] NULL , [loginame] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AI NULL , [hostname] [nchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AI NOT NULL , [dbname] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AI NULL ) ON [PRIMARY]
Script to add logs, you can run each minute to update the log. This script avoids to repeater, it only saves new connections. We recommend using a job and schedule each minute to run this script.
INSERT INTO master.dbo.dbaLogAccess (ConnectionDate, loginame, hostname, dbname) SELECT DISTINCT tbNew.ConnectionDate, tbNew.loginame, tbNew.hostname, tbNew.dbname FROM (SELECT CONVERT(char(10), GETDATE(), 126) AS ConnectionDate, RTRIM(loginame) AS loginame, hostname, CASE WHEN dbid = 0 THEN '' WHEN dbid <> 0 THEN DB_NAME(dbid) END AS dbname FROM master.dbo.sysprocesses WHERE (hostname <> '')) AS tbNew LEFT OUTER JOIN master.dbo.dbaLogAccess AS tbOld ON tbNew.ConnectionDate = tbOld.ConnectionDate AND tbNew.loginame = tbOld.loginame AND tbNew.hostname = tbOld.hostname AND tbNew.dbname = tbOld.dbname WHERE (tbOld.dbaLogAccessId IS NULL);
This code limit connection by day, we can change by hour or by minute, you just change how many character you use it:
print CONVERT(char(14), GETDATE(), 126) + '00:00'
print CONVERT(char(17), GETDATE(), 126) + '00'
print CONVERT(char(20), GETDATE(), 126)
Well, you may do not like to use [master] database, but it is the place to record the system-level information. Good news, you can easily change it.
or you can use : https://www.sqlshack.com/creating-successful-auditing-strategy-sql-server-databases/