查询的只读子句
Read-only clause for a query
我想允许用户通过 ASP 页面对我的数据库进行 运行 查询,但是我希望将此查询限制为只读。
我会尽可能多地检测 ASP 本身(检测单词删除、更新、删除等),而不是 运行 这些场景中的查询,但是,有一种方法,当我的 ASP 提交查询时,我可以在查询中附加一个标志,让它以只读方式执行,而不管其内容如何?
我意识到,如果可能的话,update/delete/drop 语句会出错 - 这很好。
我还想避免将整个数据库甚至 table 设置为只读。
我也不想以任何形式复制我的数据库。
感谢您的帮助。
段
谢谢 Allan S. Hansen,我使用 username/password 方法效果很好。
您的查询应该是动态的。主要问题 - sql 注入。
我推荐这种方式:
- 创建数据库角色 [DYNAMIC_SQL]。将表所需的 select 权限授予 [DYNAMIC_SQL] 角色。
- 无需登录即可创建数据库用户 [dynamic_sql_proxy]。映射 [DYNAMIC_SQL] 角色。
- 创建过程 [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;
我想允许用户通过 ASP 页面对我的数据库进行 运行 查询,但是我希望将此查询限制为只读。
我会尽可能多地检测 ASP 本身(检测单词删除、更新、删除等),而不是 运行 这些场景中的查询,但是,有一种方法,当我的 ASP 提交查询时,我可以在查询中附加一个标志,让它以只读方式执行,而不管其内容如何?
我意识到,如果可能的话,update/delete/drop 语句会出错 - 这很好。
我还想避免将整个数据库甚至 table 设置为只读。
我也不想以任何形式复制我的数据库。
感谢您的帮助。
段
谢谢 Allan S. Hansen,我使用 username/password 方法效果很好。
您的查询应该是动态的。主要问题 - sql 注入。 我推荐这种方式:
- 创建数据库角色 [DYNAMIC_SQL]。将表所需的 select 权限授予 [DYNAMIC_SQL] 角色。
- 无需登录即可创建数据库用户 [dynamic_sql_proxy]。映射 [DYNAMIC_SQL] 角色。
- 创建过程 [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;