我正在使用Sql Server 2008并且有一个在内部使用sp_executesql的proc.通过ASP.NET执行proc时,我一直收到以下错误:
对象'MyTable',数据库'MyDatabase',架构'dbo'上的SELECT权限被拒绝.
我已经对此做了大量研究,大多数人都指出我需要在动态查询读取的基础表上授予select权限.好吧,我已经完成了这个,它似乎仍然无法正常工作:
select object_name(major_id) as object,
user_name(grantee_principal_id) as grantee,
user_name(grantor_principal_id) as grantor,
permission_name,
state_desc
from sys.database_permissions
where major_id = object_id('User') and
class = 1
Run Code Online (Sandbox Code Playgroud)
Results: MyTable public dbo SELECT GRANT MyTable guest dbo SELECT GRANT MyTable myuser dbo SELECT GRANT MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT
正如你所看到的,我试图在基础表上授予select,这已经过度了.我甚至重新编写了我的proc,以便它只在动态sql中引用MyTable.我甚至已经授予所有上述用户"proc"执行权限...没有运气.
上面的"myuser"是web.config中我的connectionstring中的用户名.
我在这里错过了什么吗?
谢谢!戴夫
我正在尝试让这个动态SQL运行(使用EXECUTE IMMEDIATE)
M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 from :m_var2 RETURNING MAX(:m_var1)+1 INTO :m_var3';
EXECUTE IMMEDIATE M_SQL_STATEMENT
USING M_COLUMN_NAME, UPPER(P_TABLE_NAME), M_COLUMN_NAME
RETURNING INTO M_SEQ_NUMBER;
Run Code Online (Sandbox Code Playgroud)
但是,在尝试运行时,我一直在努力
ORA-00903: Invalid table
Run Code Online (Sandbox Code Playgroud)
P_TABLE_NAME是一个表名,可以作为输入接受.我已确认表名和列名有效.我无法弄清楚为什么Oracle会抛出错误.
FWIW将SQL语句更改为
M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 SEQ from :m_var2 RETURNING SEQ INTO :m_var3';
Run Code Online (Sandbox Code Playgroud)
仍会导致相同的错误.
我理解,如果使用不正确,子查询对性能的影响是非常糟糕的.我有一个非常具体的场景,用户需要从表中检索过滤的记录集.将提供各种各样的过滤器,它们必须支持组合.此外,一组开发人员将定期创建新的过滤器.
我不喜欢一个增长的,单片的SQL查询与大量参数的想法.我不喜欢一堆具有相同SELECT语句和不同WHERE子句的自治SQL查询.我喜欢动态SQL查询的想法,但我不确定我应该使用什么样的结构.我可以想到4个基本选项:(如果还有更多我不知道的话,那么请不要犹豫,建议他们)
我创建了一个SQL小提琴来演示(和配置)它们:
下面是小提琴的摘录,提供我正在谈论的内容:
------------------------------------------------------------------------
--THIS IS AN EXCERPT FROM THE SQL FIDDLE -- IT IS NOT MEANT TO COMPILE--
------------------------------------------------------------------------
--
--"INNER JOIN" test
SELECT COUNT(*)
FROM
@TestTable Test0
INNER JOIN @TestTable Test1 ON Test1.ID=Test0.ID AND Test1.ID % @i = 0
INNER JOIN @TestTable Test2 ON Test2.ID=Test0.ID AND Test2.ID % @j = 0
INNER JOIN @TestTable Test3 ON Test3.ID=Test0.ID AND Test3.ID % @k = 0
--
--"FROM subqueries" test
SELECT COUNT(*) …Run Code Online (Sandbox Code Playgroud) 我想选择列名但我不知道表结构,它可能会改变所以我不能只用列名硬编码select语句.我也不想选择每一列.有没有简单的方法来做到这一点?
我的想法是这两个查询的某种组合,但我的SQL不是那么好.
SHOW COLUMNS FROM table_name;
SELECT * FROM table_name;
Run Code Online (Sandbox Code Playgroud)
我尝试使用子选择,但它没有用.似乎没有发生任何事情,我没有得到错误我没有得到任何结果
SELECT (SELECT column_name
FROM information_schema.columns
WHERE table_name ='table_name')
FROM table_name;
Run Code Online (Sandbox Code Playgroud)
也许我需要加入?..无论如何,任何帮助都会很棒,谢谢
我有一个存储过程作为SQL命令文本,它传递一个包含表名称的参数.然后proc从该表返回数据.我不能直接将表调用为OLE DB源,因为某些业务逻辑需要发生在proc中的结果集中.在SQL 2008中,这很好用.在升级的2012软件包中,我得到"无法确定元数据,因为...包含动态SQL.请考虑使用WITH RESULT SETS子句来明确描述结果集."
问题是我无法在proc中定义字段名称,因为作为参数传递的表名可以是不同的值,并且结果字段每次都可以不同.有人遇到这个问题还是有什么想法?我使用动态SQL尝试了各种各样的事情,使用"dm_exec_describe_first_result_set",临时表和包含WITH RESULT SETS的CTE,但它在SSIS 2012中不起作用,同样的错误.Context是许多动态SQL方法的问题.
这是我尝试的最新事情,没有运气:
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * FROM ' + @dataTableName
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr +',','') + [name] + ' ' + system_type_name FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1)
exec('exec(''SELECT * FROM myDataTable'') WITH RESULT SETS ((' + @listStr + '))')
Run Code Online (Sandbox Code Playgroud) 我不得不求助于ORM不足的原始SQL(使用Django 1.7).问题是大多数查询最终都有80-90%的相似性.在不违反可重用性的情况下,我无法找到构建查询的强大而安全的方法.
字符串连接是唯一的出路,即使用if-else条件构建无参数查询字符串,然后使用预准备语句安全地包含参数(以避免SQL注入).我想按照一种简单的方法来为我的项目模板化SQL,而不是重新发明一个迷你ORM.
例如,考虑以下查询:
SELECT id, name, team, rank_score
FROM
( SELECT id, name, team
ROW_NUMBER() OVER (PARTITION BY team
ORDER BY count_score DESC) AS rank_score
FROM
(SELECT id, name, team
COUNT(score) AS count_score
FROM people
INNER JOIN scores on (scores.people_id = people.id)
GROUP BY id, name, team
) AS count_table
) AS rank_table
WHERE rank_score < 3
Run Code Online (Sandbox Code Playgroud)
我怎么能够:
a)添加可选WHERE约束people 或
b)更改INNER JOIN为LEFT OUTER 或
c)更改COUNT为SUM 或
d)完全跳过该OVER …
我试图使用PostgreSQL截断模式中的所有表.它显示此错误:
ERROR: relation "Building" does not exist
CONTEXT: SQL statement "TRUNCATE TABLE "Building" CASCADE"
PL/pgSQL function truncate_schema(character varying) line 15 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)
这是我使用的功能:
CREATE OR REPLACE FUNCTION truncate_schema(schema IN VARCHAR) RETURNS void AS $$
DECLARE
statements CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = 'BASE TABLE' AND table_schema = schema;
BEGIN
FOR stmt IN statements LOOP
EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ' CASCADE';
END LOOP;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
怎么做得好?
我在PostgreSQL中有这个功能:
CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[])
RETURNS SETOF typ_new AS
$BODY$
declare
begin
CREATE OR REPLACE VIEW newView as (select * from func2($1,$2,$3));
end;
$BODY$
LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)
func2也会返回,SETOF typ_new因此它们兼容.
运行时我收到一个错误:ERROR: there is no parameter $1
如果我更改$1为参数名称,a则错误更改为
ERROR: column "a" does not exist
我也尝试过动态SQL:
sqlstr ='CREATE OR REPLACE VIEW newView (columns... ) as
(select * from func2('||$1||','||$2||','||$3||'))';
execute sqlstr;
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为$3是integer[]和||不能使用数组.
我该如何解决这个问题?
我有一个项目,其中前端JavaScript指定要排序的列的列表.
然后在后端我有多层应用程序.典型情况
请注意,System.Linq.DynamicDNX Core v5.0或.NET Platform v5.4不支持,因此我无法使用该库.
我在我的Things存储库中有以下实现:
public async Task<IEnumerable<Thing>> GetThingsAsync(IEnumerable<SortModel> sortModels)
{
var query = GetThingsQueryable(sortModels);
var things = await query.ToListAsync();
return things;
}
private IQueryable<Thing> GetThingsQueryable(IEnumerable<SortModel> sortModels)
{
var thingsQuery = _context.Things
.Include(t => t.Other)
.Where(t => t.Deleted == false);
// this is the problematic area as it does not return a valid queryable
string orderBySqlStatement = GetOrderBySqlStatement(sortModels);
thingsQuery = thingsQuery.FromSql(orderBySqlStatement);
return thingsQuery ;
}
/// this …Run Code Online (Sandbox Code Playgroud) linq dynamic-sql sql-order-by entity-framework-core asp.net-core
我对公共模式中所有表的触发器有以下查询:
SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ' AS trigger_creation_query
FROM (
SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name
FROM information_schema.tables
WHERE table_schema='public'
) AS foo;
Run Code Online (Sandbox Code Playgroud)
我知道如何检查触发器是否存在:
SELECT tgname
from pg_trigger
where not tgisinternal AND tgname='randomname'
Run Code Online (Sandbox Code Playgroud)
但是,如何在第一个查询中检查同名触发器是否已存在 - 并跳过创建它并继续?这是我的解决方案,但它不起作用:
SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); …Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
postgresql ×4
sql ×4
plpgsql ×3
sql-server ×2
asp.net ×1
asp.net-core ×1
function ×1
linq ×1
metadata ×1
mysql ×1
oracle10g ×1
orm ×1
permissions ×1
plsql ×1
sql-order-by ×1
ssis ×1
subquery ×1