AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 140657
Accepted
Geoff Dawdy
Geoff Dawdy
Asked: 2016-06-08 11:35:02 +0800 CST2016-06-08 11:35:02 +0800 CST 2016-06-08 11:35:02 +0800 CST

错误:“无法删除证书,因为一个或多个实体已使用它进行签名或加密。”

  • 772

我有一个要从数据库中删除的证书。

如果我发出命令

DROP CERTIFICATE <FooCert>

我得到错误

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

根据 Jason Strate 的说法,我应该能够找出证书签名的内容。

以下查询返回 0 行:

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'

我还尝试根据这个 SO question 将实体解耦。 https://stackoverflow.com/questions/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

如何删除此证书的依赖项以便删除它?

sql-server sql-server-2012
  • 2 2 个回答
  • 14686 Views

2 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2016-06-08T18:53:13+08:002016-06-08T18:53:13+08:00

    要查找与证书和非对称密钥相关的项目,请首先尝试在此 DBA.SE 答案中发布的查询:

    查找签名的过程、函数、触发器、程序集以及哪些证书/非对称密钥

    如果这不返回任何对象,请尝试以下查询:

    • 登录
    • 用户
    • 服务代理端点
    • 数据库镜像端点
    • 对称键
    • 数据库加密密钥(用于 TDE)

    请注意,登录是服务器/实例级别,而其他一切都是数据库级别。此外,数据库加密密钥虽然处于数据库级别,但在返回所有数据库数据的 DMV 中报告,因此不会根据“当前”数据库而更改。

    -- 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
  2. MichaelChan
    2016-12-20T19:53:43+08:002016-12-20T19:53:43+08:00

    遇到了类似的问题,对我来说,这个查询帮助我找到了签名的对象:

    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'
    

    资源

    然后我只是使用以下命令作为示例,其中dbo.sp_name签名对象和STOREDPROCEDURESIGNINGCERT签名证书。

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

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve