查询的只读子句

时间:2017-01-05 04:28:53

标签: sql-server readonly

我希望允许用户通过ASP页面在我的数据库上运行查询,但是我希望将此查询限制为只读。

我会尝试尽可能多地检测ASP本身(检测单词丢弃,更新,删除等)而不是在这些场景中运行查询,但是,有没有办法我可以只添加一个标志我的ASP提交它以使其以只读方式执行时的查询,无论其内容如何?

我意识到,如果可以的话,更新/删除/删除语句会出错 - 这很好。

我还想避免将整个数据库甚至表设置为只读。

我也不想以任何形式复制我的数据库。

谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

谢谢Allan S. Hansen,我使用了用户名/密码方法,效果很好。

答案 1 :(得分:0)

您的查询应该是动态的。主要问题 - sql注入。 我推荐这种方式:

  1. 创建数据库角色[DYNAMIC_SQL]。将表所需的选择权限授予[DYNAMIC_SQL]角色。
  2. 无需登录即创建数据库用户[dynamic_sql_proxy]。使用[DYNAMIC_SQL]角色进行映射。
  3. 使用[dynamic_sql_proxy]创建具有硬编码执行权限的过程[dynamic_sql__call]。将自定义查询传递给此过程。
  4. 脚本: (1)

    USE [your_db]
    GO
    CREATE ROLE [DYNAMIC_SQL]
    GO
    
    
    GRANT SELECT ON [dbo].[your_table] TO [DYNAMIC_SQL] AS [dbo]
    ***
    

    (2)

    CREATE USER [dynamic_sql_proxy] WITHOUT LOGIN WITH DEFAULT_SCHEMA = [dbo]
    ALTER ROLE [DYNAMIC_SQL] ADD MEMBER [dynamic_sql_proxy]
    

    (3)

    CREATE PROCEDURE [dbo].[dynamic_sql__call]
         @err_code      INT             OUTPUT
        ,@err_msg       NVARCHAR(4000)  OUTPUT
        ,@sql           NVARCHAR(MAX)
    WITH EXECUTE AS 'dynamic_sql_proxy'
    AS
    BEGIN
    
        SET @err_code   =   0;
        SET @err_msg    =   SPACE(0);
    
        BEGIN TRY
    
            EXEC(@sql);
    
        END TRY
        BEGIN CATCH
    
            PRINT 'Please handle your error';
    
        END CATCH;
    
        RETURN @err_code;   
    
    END;