我正在开发一个运行SQL服务器的产品,该服务器允许某些应用程序登录,并且他们的登录被授予运行存储过程的权限 - 并且没有ELSE.存储过程由管理员拥有; 存储过程接受查询并执行它,然后将结果返回给应用程序.
遗憾的是,我无法弄清楚为什么应用程序可以调用它被授予访问权限的存储过程,但是存储过程无法执行传递给它的SQL语句.
当我以管理员身份登录时,存储过程执行传入的查询,但是当我以受限用户身份登录时,它会在execute语句中抛出异常.
例如:
EXEC [Admin].[STORED_PROC] @SQL_STATEMENT = 'SELECT * FROM table_x'
STORED_PROC看起来像这样:
BEGIN TRY EXEC (@SQL_STATEMENT) END TRY BEGIN CATCH -- some logging when an exception is caught, and the exception is caught here!!! END CATCH
try catch语句中没有任何内容,除了EXEC ...和SQL_STATEMENT在我以管理员身份登录时有效,但在我以用户身份登录时却无效.
任何人都可以帮我弄清楚我需要设置哪些权限才能允许用户只通过存储过程运行查询?
因此,有一些关于允许通过存储过程执行原始SQL语句的注释违背了使用存储过程的目的...但实际上我们实际上正在做的是我们将加密的SQL语句传递给存储过程并且存储的proc获取语句解密,然后它执行它.
所以是的,实际上原始SQL语句不安全,它们无法实现存储过程的目的,但我不知道如何加密通过ODBC传递并针对2005之前的SQL Server运行的SQL查询.
无论如何,我试图提出一些最小的保护措施,至少要有一些基本的安全措施.
由于您使用的是动态SQL,因此SQL Server无法分辨您正在使用哪些表,因此您必须同时为所有表授予SELECT权限