it-swarm.com.de

Fehler: "Das Zertifikat kann nicht gelöscht werden, da eine oder mehrere Entitäten damit signiert oder verschlüsselt sind."

Ich habe ein Zertifikat, das ich aus der Datenbank entfernen möchte.

Wenn ich den Befehl erteile

DROP CERTIFICATE <FooCert>

Ich bekomme den Fehler

The certificate cannot be dropped because one or more entities are either signed or encrypted using it

Laut Jason Strate Ich sollte herausfinden können, was mit dem Zertifikat signiert ist.

Die folgende Abfrage gibt 0 Zeilen zurück:

SELECT OBJECT_SCHEMA_NAME(co.major_id) + '.' + OBJECT_NAME(co.major_id)
FROM sys.certificates c 
INNER JOIN sys.crypt_properties co ON c.thumbprint = co.thumbprint
WHERE co.crypt_type_desc = 'SIGNATURE BY CERTIFICATE' 
AND c.name = 'FooCert'

Ich habe auch versucht, die Entitäten gemäß dieser Frage zu entkoppeln SO Frage. https://stackoverflow.com/questions/52460/how-do-i-find-and-decouple- Entitäten-aus-einem-Zertifikat-beim-Upgrade-ms-sqlserv

Wie kann ich die Abhängigkeiten von diesem Zertifikat entfernen, damit ich es entfernen kann?

8
Geoff Dawdy

Versuchen Sie zunächst die in diesem DBA.SE veröffentlichte Abfrage, um Elemente zu finden, die mit Zertifikaten und asymmetrischen Schlüsseln verknüpft sind. Antwort:

Finden Sie signierte Prozeduren, Funktionen, Trigger, Assemblys und nach welchen Zertifikaten/asymmetrischen Schlüsseln

Wenn dadurch keine Objekte zurückgegeben werden, versuchen Sie als Nächstes die folgenden Abfragen, nach denen gesucht wird:

  • Anmeldungen
  • Benutzer
  • Service Broker-Endpunkte
  • Datenbankspiegelungsendpunkte
  • Symmetrische Tasten
  • Datenbankverschlüsselungsschlüssel (für TDE verwendet)

Bitte beachten Sie, dass Anmeldungen auf Server-/Instanzebene erfolgen, während alles andere auf Datenbankebene erfolgt. Außerdem werden Datenbankverschlüsselungsschlüssel auf Datenbankebene in einer DMV gemeldet, die Daten für alle Datenbanken zurückgibt und sich daher nicht basierend auf der "aktuellen" Datenbank ändert.

-- Server / Instance Logins (results not sensitive to local / current Database)
;WITH certs_n_keys AS
(
  SELECT 'Certifcate' AS [Type], crts.name, crts.certificate_id AS [cert_or_asymkey_id],
         crts.principal_id, crts.pvt_key_encryption_type_desc, crts.[sid],
         crts.thumbprint
  FROM   [master].sys.certificates crts
  UNION ALL
  SELECT 'Asymmetric Key' AS [Type], asym.name, asym.asymmetric_key_id AS
         [cert_or_asymkey_id], asym.principal_id, asym.pvt_key_encryption_type_desc,
         asym.[sid], asym.thumbprint
  FROM   [master].sys.asymmetric_keys asym
)
SELECT cnk.*, '---' AS [---],
       sp.[name] AS [PrincipalName], sp.principal_id, sp.type_desc,
       sp.create_date, sp.modify_date
FROM   certs_n_keys cnk
INNER JOIN sys.server_principals sp
        ON sp.[sid] = cnk.[sid];


-- Database Users
;WITH certs_n_keys AS
(
  SELECT 'Certifcate' AS [Type], crts.name, crts.certificate_id AS [cert_or_asymkey_id],
         crts.principal_id, crts.pvt_key_encryption_type_desc, crts.[sid],
         crts.thumbprint
  FROM   sys.certificates crts
  UNION ALL
  SELECT 'Asymmetric Key' AS [Type], asym.name, asym.asymmetric_key_id AS
         [cert_or_asymkey_id], asym.principal_id, asym.pvt_key_encryption_type_desc,
         asym.[sid], asym.thumbprint
  FROM   sys.asymmetric_keys asym
)
SELECT cnk.*, '---' AS [---],
       dp.[name] AS [PrincipalName], dp.principal_id, dp.type_desc,
       dp.create_date, dp.modify_date
FROM   certs_n_keys cnk
INNER JOIN sys.database_principals dp
        ON dp.[sid] = cnk.[sid];


-- Service Broker Endpoints
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       endpts.*
FROM   sys.certificates crts
INNER JOIN sys.service_broker_endpoints endpts
        ON endpts.certificate_id = crts.certificate_id;


-- Database Mirroring Endpoints
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       endpts.*
FROM   sys.certificates crts
INNER JOIN sys.database_mirroring_endpoints endpts
        ON endpts.certificate_id = crts.certificate_id;


-- Symmetric Keys (scroll results to the right to see Key name)
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       ncrptns.*, '---' AS [---], symkys.*
FROM   sys.certificates crts
INNER JOIN sys.key_encryptions ncrptns
        ON ncrptns.[thumbprint] = crts.[thumbprint]
INNER JOIN sys.symmetric_keys symkys
        ON symkys.[symmetric_key_id] = ncrptns.[key_id];


-- Database Encryption Keys (for TDE; results not sensitive to local / current Database)
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       DB_NAME(dbkeys.[database_id]) AS [DatabaseName], dbkeys.*
FROM   [master].sys.certificates crts
INNER JOIN sys.dm_database_encryption_keys dbkeys
        ON dbkeys.[encryptor_thumbprint] = crts.[thumbprint];
6
Solomon Rutzky

Bei einem ähnlichen Problem ist mir diese Abfrage geholfen, das signierte Objekt zu finden:

SELECT OBJECT_SCHEMA_NAME(co.major_id) + '.' + OBJECT_NAME(co.major_id), c.name 
FROM sys.certificates c 
INNER JOIN sys.crypt_properties co ON c.thumbprint = co.thumbprint
WHERE co.crypt_type_desc = 'SIGNATURE BY CERTIFICATE'

Quelle

Dann habe ich nur den folgenden Befehl als Beispiel verwendet, wobei dbo.sp_name ist das signierte Objekt und STOREDPROCEDURESIGNINGCERT ist das signierende Zertifikat.

DROP SIGNATURE FROM OBJECT::dbo.sp_name BY CERTIFICATE STOREDPROCEDURESIGNINGCERT
1
MichaelChan