查询的只读子句

Read-only clause for a query

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

我会尽可能多地检测 ASP 本身(检测单词删除、更新、删除等),而不是 运行 这些场景中的查询,但是,有一种方法,当我的 ASP 提交查询时,我可以在查询中附加一个标志,让它以只读方式执行,而不管其内容如何?

我意识到,如果可能的话,update/delete/drop 语句会出错 - 这很好。

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

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

感谢您的帮助。

谢谢 Allan S. Hansen,我使用 username/password 方法效果很好。

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

  1. 创建数据库角色 [DYNAMIC_SQL]。将表所需的 select 权限授予 [DYNAMIC_SQL] 角色。
  2. 无需登录即可创建数据库用户 [dynamic_sql_proxy]。映射 [DYNAMIC_SQL] 角色。
  3. 创建过程 [dynamic_sql__call] 并将执行权限硬编码为 [dynamic_sql_proxy]。将您的自定义查询传递给此过程。

脚本: (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;