如何在SQL Server 2008中隐藏存储过程的脚本

8

我在SQL Server中编写了一个存储过程。

现在的问题是,我不希望任何人查看或编辑我的脚本。

请记住,我正在使用标准的登录ID和密码。这些信息是与每个人共享的。

因此,我需要一种方法可以让每个人都能执行该存储过程,但他们不能查看脚本。

谢谢!


与其加密,不如修复您的安全性。每个人都使用相同的登录凭据和权限是没有任何借口的。 - HLGEM
4个回答

8
你需要使用 WITH ENCRYPTION,它可以加密你的存储过程的代码。
CREATE PROCEDURE usp_MyProc
WITH ENCRYPTION
AS
SELECT *
FROM myTable

需要注意的是,根据MSDN的说明:

没有访问系统表或数据库文件权限的用户无法检索混淆文本。然而,特权用户可以通过DAC端口访问系统表或直接访问数据库文件来获取文本。

以下是一些参考和进一步阅读:


此外,SQL Server 中的 WITH ENCRYPTION 实际上应该称为 WITH MINOR_OBFUSCATION。如果您知道要搜索什么,那么有很多资源可以帮助解密系统对象,并且它们不限于特权用户或 DAC。 - Aaron Bertrand
没错,这并不能阻止那些下定决心要查看代码的人,但它能够把大多数人拒之门外。 - John N

4
SQL Server并没有提供真正可靠的方法来保护模块代码。WITH ENCRYPTION子句应该被命名为WITH LOOSE_OBFUSCATION之类的东西,因为"加密"很容易被破解。无论你如何使用SQL Server,都无法使代码对非常规查看者以外的所有人难以理解——任何决心破解的人都能够轻松地打败这些本地方法。虽然这可能已经足够满足您的需求,但更安全的方法(但仍不完美)是将一些或所有过程的业务逻辑放入CLR中(在此阅读更多内容)

2

使用encryption关键字来对你的存储过程进行加密。这将隐藏代码:

CREATE PROCEDURE dbo.foo 
WITH ENCRYPTION 
AS 
BEGIN 
    SELECT 'foo' 
END

任何人仍然可以运行SP,对吧?只是代码被隐藏了。 - LearnByReading

0
避免在除非有特定要求的情况下使用WITH ENCRYPTION选项。这可能会导致以后出现管理问题。
使用WITH ENCRYPTION不是隐藏对象的定义/代码的推荐做法。幸运的是,对于SQL Server,有一种替代方法。
如果需要将任何对象的定义/代码对用户进行隐藏,则可以使用标准权限来实现此目的。可以通过授予或撤销"查看定义"权限来完成。
如果向某个用户拒绝了"查看定义"权限,则该用户将无法在SSMS中查看该对象,也无法通过系统存储过程sp_helptext查看其代码。
"查看定义"权限也可以用于SQL Server中的其他对象,如表、同义词等。可以使用T-SQLSSMS来授予或拒绝"查看定义"权限。
要通过SSMS实施权限控制,请按照以下步骤进行:
  1. 右键单击要隐藏定义的对象
  2. 点击"属性",将出现一个窗口,在该窗口上选择为所选用户或角色授予或拒绝"查看定义"权限

拒绝授予 View Definition 权限将会为特定用户隐藏对象,并且该用户将无法使用 sp_helptext 查看定义。

其他权限如 SELECT, INSERT 等将保持不变。

权限是灵活的,可以在以下四个级别实现:

  1. 服务器级别。在服务器级别,此权限将列为 View Any Definition。
  2. 数据库级别
  3. 架构级别
  4. 单个实体级别

谢谢,希望能够消除疑惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接