Benutzung von Oracle (Tabellen, Prozeduren)

Befehle Anlage von Tabellen, Prozeduren etc.:

https://docs.oracle.com/cd/E18283_01/server.112/e17120/tables003.htm#i1106335

https://stackoverflow.com/questions/1799128/oracle-if-table-exists

https://docs.oracle.com/cd/E10405_01/appdev.120/e10379/ss_oracle_compared.htm

https://asktom.oracle.com/pls/apex/f?p=100:11:::::P11_QUESTION_ID:9541246000346968042

Unterschiede der Datentypen bzw. das Mapping von Datentypen:
https://learn.microsoft.com/en-us/sql/relational-databases/replication/non-sql/data-type-mapping-for-oracle-publishers

https://www.mssqltips.com/sqlservertip/2944/comparing-sql-server-and-oracle-datatypes/

Die Neuanlage von Oracle Datenbanken sind nicht so einfach wie MS SQL Server….

Downgrade MS SQL Server, SSAS, etc.

How to easily downgrade SQL Server from Enterprise to Developer/Standard Edition – Datarrett

Downgrade from SQL Server Enterprise Edition to Standard Edition (mssqltips.com)

Wenn die o. g. Lösung nicht ausreichend ist und ggf. komplett neu aufgesetzt werden müsste, hier können vielleicht vorher die SIDs gesichert und später wieder eingespielt:

Ask Prof.Toh: How to downgrade Microsoft SQL Server 2005 Enterprise version to Standard version (asktoh.blogspot.com)

Feature der Enterprise-Edition könnten zu Problemen führen?

Ereignisanzeige/Events „ID 10016“

Es sind neue „Error“ Einträge mit dem ID=10016. Und der Text:

The application-specific permission Settings do not grant Local Activivation permission for the COM Server application with CLSID {….} and APPID {….} to the user ….. SID {….} from address localHost (Using LRPC) running in the application container Unavailable SID {….}. This security permission can be modified using the Component Services administrative tool.

Link: https://answers.microsoft.com/en-us/windows/forum/windows_8-performance/application-container-unavailable-sid-unavailable/4ec39b15-1f43-4d7a-bbf6-11706a685b7c

Nach dem Klären, dass es sich um die „COM Server application“ handelt „Microsoft.SQLServer.Dts.Server.DtsServer“ und in den „Component Services“ den „Microsoft SQL Server Integration Service 11.0“ ging ich davon es aus reichen sollte dem fraglichem „Agent-User“ die Rechte zu den Datenbanken „msdb“ und „SSISDB“ zu erteilen.

/*
Zugriff auf msdb und SSISDB
Link: https://docs.microsoft.com/en-us/sql/integration-services/security/integration-services-roles-ssis-service?view=sql-server-2017
Hinweis: Um SSIS-Jobs anzulegen, ist es meist notwendig weitere Einstellungen vorzunehmen, wie z.B. einen "Proxy".
*/
USE [SSISDB]
GO
CREATE USER [NT SERVICE\SQLAgent$SQL....] FOR LOGIN [NT SERVICE\SQLAgent$SQL....] WITH DEFAULT_SCHEMA=[dbo]
GO
EXEC sp_addrolemember @rolename = 'ssis_admin', @membername = 'NT SERVICE\SQLAgent$SQL....'
GO
USE [msdb]
GO
CREATE USER [NT SERVICE\SQLAgent$SQL....] FOR LOGIN [NT SERVICE\SQLAgent$SQL....] WITH DEFAULT_SCHEMA=[dbo]
GO
EXEC sp_addrolemember @rolename = 'db_ssisoperator', @membername = 'NT SERVICE\SQLAgent$SQL....'
GO

Weiterhin erschien die Fehlermeldungen und musste dem oberem Link folgen und die „Component Services“ anzupassen.
Wobei die Fehlermeldungen in der Ereignisanzeige nicht mehr auftraten.

SQL Server: Database Mail

Um das Einrichten von Database Mail-Account können diese Schritte manuell vornehmen werden:
Ähnliche Beschreibungen:
http://sqlcache.blogspot.com/2014/11/sql-server-database-mail.html
https://www.gevitas.de/wiki/index.php?title=E-Mails_mit_dem_Microsoft-SQL-Server

Beschreibung:

Vermutlich ist diese Bestätigung notwendig:

Und nun dem „Profil“ ein Namen geben und einen SMTP-Account hinterlegen:

Und nun sind die Zugriffsdaten des Exchange Server notwendig…
Wir empfehlen dafür einen eigenen Exchange Account und dies mit dem IT-Administratoren abzusprechen – also eigentlich wie ein normaler Anwender.
Z.B. könnte dieser heißen wie „SQLServer“. 
Möglicherweise ist aber bei Ihnen bei allen anderen SQL Servern auch schon Database Mail eingerichtet und der gleiche Account benutzt ist. Dazu meist nur benutzt bei kritischen Fehlern an alle Admins versendet werden. Wir werden jedoch vermutlich regelmäßig mehr versenden als nur bei Fehlern.
Noch einmal: Dieser „Account“ wird nur E-Mail versenden und nie E-Mail „lesen“ – Also falls E-Mails eingehen, werden diese ewig in dem Postfach liegen bleiben.

Port, SSL-Häkchen und E-Mail Server sind den Adminstratoren bekannt
(„Reply e-mail“ bitte genauso eintragen, wie die „E-mail address“)
Links Information über E-Mail Server:
https://support.office.com/de-de/article/server-einstellungen-die-sie-von-ihrem-e-mail-anbieter-benötigen-c82de912-adcc-4787-8283-45a1161f3cc3

Nach dem „OK“ sind wir wieder zurück:

Und müssen „Next“ klicken und in diesem Schritt muss das Profil aktiviert werden…

In diesem nächstem Schritt müssen wir vermutlich die maximale Größe von E-Mails anpassen. Eine „0“ mehr, also 10 MB erlauben:

Dann wird das lediglich noch einmal zusammengefasst und man muss mit „Finish“beenden. Danach sollten alle fünf Aktionen mit „Success“ beendet sein.

Und der Versand von E-Mails kann jetzt getestet werden:

Falls die Test-Email nicht am Ziel angekommen ist, finden Sie den dort wo die „Send Test E-Mail…“ Popup war, auch das „View Database Mail Log“…

Typische Fehlerldung: „The SMTP Server Requires a Secure Connection or the Client was not Authenticated“
https://blog.sqlauthority.com/2018/06/30/sql-server-database-mail-error-the-smtp-server-requires-a-secure-connection-or-the-client-was-not-authenticated-the-server-response-sas-5-5-1/

Links:
Leider hilft die spezielle SQL Server 2017 – Site gar nicht:
https://docs.microsoft.com/de-de/sql/relational-databases/database-mail/configure-database-mail?view=sql-server-2017

Links:
https://docs.microsoft.com/de-de/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-2017

 

Fehlermeldungen:

Msg 22050, Level 16, State 1, Line 3
Failed to initialize sqlcmd library with error number -2147467259.

Hinweis: Die gleiche Fehlermeldung bekommt man auch, wenn das „QuerySQL“ nicht mit einer vollständigen „Select * FROM Datenbank.Schema.Tabelle“ Formalimus arbeitet. Diese Stored Procedure ruft die „QuerySQL“ in einer neuer Query Umgebung (IMHO: in Master)… Und die Fehlermeldung halte ich als irreführend!

 

SQL Server: Welcher Port wird vom SQL Server genutzt?

Es ist zwar möglich die alle Ports festzustellen
netstat -ano
Aber das macht eine zu lange Liste…
Kurzer Test ob der Standard Port 1433 festgelegt ist:
netstat -ano | findstr 1433
Aber wenn das nichts bringt, dann den SQL Server selber fragen:

SELECT DISTINCT 
    local_tcp_port 
FROM sys.dm_exec_connections 
WHERE local_tcp_port IS NOT NULL 

SQL Server: Strukturelle Änderungen einer Datenbank soll dokumentiert werden…

/*
Jede strukturelle Aenderungen an einer oder allen Datenbanken soll (voellig automatisch) nachvollziehbar sein.

Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)
Um alle technische Aenderungen nachvollziehen zu koennen.
Also werden alle Veraenderungen an Struktruen von allen Datenbanken dokumentiert.
Dies gilt auch fuer Trigger und neue Datenbanken u.ae.
Es werden somit saemtliche "DDL" Befehle dokumentiert, aber keine DML Befehle und deren Wirkungen!
DDL = Data Definition Language
DML = Data Manipulation Language

Moeglicherweise sollte die getriggerte ƒnderungen 
an die Ziel-Datenbank (bsp. master.dbo.FOD_ddl_log) 
eines zweitem SQL-Server gesendet werden.

Hinweis: sa-Rechte (oder vergleichbare) sind notwendig.
Hinweis: Dieser Trigger ist auf dem SQL-Server unter ServerObjects/Triggers zu finden

Change:
20160126 FOD: Diese Beschreibung und JEGLICHER "DELETE-Code" wurde auskommentiert + with execute as 'sa'


*/


USE master;
GO

--Logging-Tabelle anlegen:
CREATE TABLE FOD_ddl_log (
	id bigint identity(1,1),
       xmlEVENTDATA xml
);
GO

--Logging-View anlegen (nur wg. dem Auslesen von XML):
Create View dbo.vFOD_ddl_log
as
Select id, 
		xmlEVENTDATA.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime') as PostTime,
		xmlEVENTDATA.value('(/EVENT_INSTANCE/ServerName)[1]', 'varchar(256)') as ServerName,
		xmlEVENTDATA.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)') as DatabaseName, 
		xmlEVENTDATA.value('(/EVENT_INSTANCE/UserName)[1]', 'varchar(256)') as UserName, 
		xmlEVENTDATA.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)') as EventType, 
		xmlEVENTDATA.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') as TSQLCommand,
		xmlEVENTDATA
from FOD_ddl_log 

--TRIGGER  anlegen:
CREATE TRIGGER FOD_ddl_log 
	/*ON DATABASE*/
	ON ALL SERVER
	WITH EXECUTE AS 'sa'
	FOR DDL_DATABASE_LEVEL_EVENTS 
	AS
	DECLARE @data XML;
	SET @data = EVENTDATA();
	INSERT FOD_ddl_log  ( [xmlEVENTDATA] ) 
	VALUES ( @data ) ;
GO


--- DER CODE SOLL ERST NUR BIS HIER GESTARTET WERDEN!!!


/*
--Test the trigger:
--------------------
Begin Transaction
CREATE TABLE TestTable (a int)
Rollback

CREATE TABLE TestTable (a int)
GO
DROP TABLE TestTable ;
GO
SELECT * FROM master.dbo.vFOD_ddl_log order by PostTime desc;
GO
*/



/*
--ALLES WIEDER ENTFERNEN, WENN ES NICHTGEWUENSCHT IST:
-----------------------------------------------------
--Drop the trigger.
DROP TRIGGER master.dbo.FOD_ddl_log
--ON DATABASE 
ON ALL SERVER
GO
--Drop View vFOD_ddl_log:
use master
go
DROP VIEW dbo.vFOD_ddl_log;
GO
--Drop table FOD_ddl_log:
use master
go
DROP TABLE dbo.FOD_ddl_log;
GO
*/







/*
--Aufwaendiges Logging:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/

--Einfaches Logging:
http://msdn.microsoft.com/en-us/library/ms173781.aspx

--Bedeutung von  ÑEvent_Instanceì
http://www.sqlteam.com/article/using-ddl-triggers-in-sql-server-2005-to-capture-schema-changes


--Die Beschreibung der Events nach Microsoft Technet:
http://technet.microsoft.com/en-us/library/ms186438(SQL.90).aspx
*/


Aufwändiges Logging:
http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/

Einfaches Logging:
http://msdn.microsoft.com/en-us/library/ms173781.aspx

Bedeutung von „Event_Instance“
http://www.sqlteam.com/article/using-ddl-triggers-in-sql-server-2005-to-capture-schema-changes

Die Beschreibung der Events nach Microsoft Technet:
http://technet.microsoft.com/en-us/library/ms186438(SQL.90).aspx

MS SQL: Wie lange dauert es noch bis die Datenbank wiederhergestellt ist?

Falls die Wiederherstellung einer Datenbank immer noch nicht fertig ist, wäre es schön, wenn man einmal feststellen kann, wie weit die Wiederherstellung zumindest ist…

**** BITTE CODE VORHER LESEN!!!! ****

/*
http://timlaqua.com/2009/09/determining-how-long-a-database-will-be-in-recovery-sql-server-2008/

ACHTUNG: CODE UNTERSCHIEDLICH VOR SQL SERVER 2012: 
	sys.xp_readerrorlog
	sys.sp_readerrorlog

*/


DECLARE @Serverversion integer = 2012  --BITTE CODE VORHER LESEN!!!!
DECLARE @DBName VARCHAR(64) = 'databasename'



If @Serverversion > 2012
BEGIN
	/*
	----------------------------
	SQL Server 2008
	----------------------------
	So, your MSSQL service crashed in the middle of a big transaction? Or you bumped the service while it was rolling back some gigantic schema change (like say a column add on a 800 million row table)? Well, as you prepare your resume in preparation for the fallout from this debockle, you can use the following query to see how much time you have left. Or, I should say, how much time it thinks you have left... which seems to swing wildly up and down... microsoft math ftw.
	*/

	DECLARE @ErrorLog AS TABLE([LogDate] CHAR(24), [ProcessInfo] VARCHAR(64), [TEXT] VARCHAR(MAX))
	INSERT INTO @ErrorLog
	EXEC sys.xp_readerrorlog 0, 1, 'Recovery of database', @DBName
 
	SELECT TOP 5
		 [LogDate]
		,SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) AS PercentComplete
		,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 AS MinutesRemaining
		,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 AS HoursRemaining
		,[TEXT]
	FROM @ErrorLog 
	ORDER BY 1 DESC
END
Else
BEGIN
	/*
	----------------------------
	Sql Server 2012 
	----------------------------
	uses a different stored procedure to read the error log:
	*/

	DECLARE @ErrorLog AS TABLE([LogDate] CHAR(24), [ProcessInfo] VARCHAR(64), [TEXT] VARCHAR(MAX))
 	INSERT INTO @ErrorLog
	EXEC master..sp_readerrorlog 0, 1, 'Recovery of database', @DBName
 
	SELECT TOP 5
		 [LogDate]
		,SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) AS PercentComplete
		,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 AS MinutesRemaining
		,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 AS HoursRemaining
		,[TEXT]
	FROM @ErrorLog 
	ORDER BY 1 DESC, 2 DESC, 3 DESC
END


Quelle: http://timlaqua.com/2009/09/determining-how-long-a-database-will-be-in-recovery-sql-server-2008/

Installation eines SQL SERVER – Error – VS Shell Installation Has Failed with Exit Code 1638

Während einer Installation eines SQL Servers 2016 und/oder SQL Server 2017:

Erste Hinweise: https://blog.sqlauthority.com/2017/12/21/sql-server-fix-error-vs-shell-installation-failed-exit-code-1638/

Workaround / Solution
Die notwendige „Redistributable Version“ installieren. Die gesuchte Version sollte im Installations Log zu finden sein!
Sollte sich diese „Redistributable Version“ jedoch nicht installieren lässt…

…müssen aktuellere Versionen deinstalliert werden, bis dann die verlangte Version installiert werden kann:

Dann die gewünschte Software installieren – in diesem Fall SQL Server 2016 und/oder SQL Server 2017.
Und dann müssen auch alle gerade deinstallierte Versionen wieder installiert werden. Wobei mit den älteren Versionen anfangen!
https://support.microsoft.com/de-de/help/2977003/the-latest-supported-visual-c-downloads

SYSTEM_VERSIONING (Temporal Tables)

What is a system-versioned temporal table?
A system-versioned temporal table is a type of user table designed to keep a full history of data changes and allow easy point in time analysis. This type of temporal table is referred to as a system-versioned temporal table because the period of validity for each row is managed by the system

 

 
(Quelle: https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables)

Beispiel:

SELECT *
FROM Employee
FOR SYSTEM_TIME
BETWEEN '2014-01-01 00:00:00.0000000'
AND '2015-01-01 00:00:00.0000000'

Video: https://channel9.msdn.com/Shows/Data-Exposed/Temporal-in-SQL-Server-2016

Weitere sehr gute Beschreibung: http://sqlhints.com/tag/for-system_time-as-of/

 

Quelle:

http://sqlhints.com/2015/12/31/temporal-tables-in-sql-server-2016-part-2-querying-system-versioned-temporal-table/