标签: dynamic-sql

在proc中使用sp_executesql时出现"select permission denied"错误(Sql Server 2008)

我正在使用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中的用户名.

我在这里错过了什么吗?

谢谢!戴夫

asp.net permissions dynamic-sql sql-server-2008

5
推荐指数
1
解决办法
4557
查看次数

使用带有绑定变量的Execute Immediate语句时,表名称错误无效

我正在尝试让这个动态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)

仍会导致相同的错误.

plsql dynamic-sql oracle10g execute-immediate

5
推荐指数
1
解决办法
6103
查看次数

FROM子句中的SQL子查询

我理解,如果使用不正确,子查询对性能的影响是非常糟糕的.我有一个非常具体的场景,用户需要从表中检索过滤的记录集.将提供各种各样的过滤器,它们必须支持组合.此外,一组开发人员将定期创建新的过滤器.

我不喜欢一个增长的,单片的SQL查询与大量参数的想法.我不喜欢一堆具有相同SELECT语句和不同WHERE子句的自治SQL查询.我喜欢动态SQL查询的想法,但我不确定我应该使用什么样的结构.我可以想到4个基本选项:(如果还有更多我不知道的话,那么请不要犹豫,建议他们)

  1. "INNER JOIN":通过INNER JOINS连接过滤器以过滤结果.
  2. "FROM子查询":通过FROM语句中的子查询进行堆栈过滤.
  3. "WHERE子查询":通过WHERE子句中的子查询来连接过滤器.
  4. "INNER JOIN子查询":一个奇怪的混合体.

我创建了一个SQL小提琴来演示(和配置)它们:

http://sqlfiddle.com/#!3/4e17b/9

下面是小提琴的摘录,提供我正在谈论的内容:

------------------------------------------------------------------------
--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)

sql-server subquery dynamic-sql

5
推荐指数
1
解决办法
5406
查看次数

如何在mySQL中动态选择列名

我想选择列名但我不知道表结构,它可能会改变所以我不能只用列名硬编码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)

也许我需要加入?..无论如何,任何帮助都会很棒,谢谢

mysql sql metadata dynamic-sql

5
推荐指数
1
解决办法
1万
查看次数

在SSIS 2012中的OLE DB源中使用动态SQL

我有一个存储过程作为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)

sql sql-server ssis dynamic-sql

5
推荐指数
1
解决办法
6564
查看次数

以编程方式构建SQL查询的强大方法

我不得不求助于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 JOINLEFT OUTER
c)更改COUNTSUM
d)完全跳过该OVER …

sql postgresql orm dynamic-sql plpgsql

5
推荐指数
1
解决办法
1162
查看次数

截断PostgreSQL中模式中的所有表

我试图使用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 function dynamic-sql plpgsql

5
推荐指数
1
解决办法
9766
查看次数

如何使用参数从函数创建VIEW?

我在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)

但它不起作用,因为$3integer[]||不能使用数组.

我该如何解决这个问题?

sql postgresql dynamic-sql

5
推荐指数
1
解决办法
5277
查看次数

如何通过Entity Framework 7(Core)中的某些实体属性动态排序

我有一个项目,其中前端JavaScript指定要排序的列的列表.

然后在后端我有多层应用程序.典型情况

  1. 服务层(服务模型'(DTO)属性匹配客户端想要订购的任何内容)
  2. 域层(它公开存储库接口以访问持久化对象)
  3. ORM层(它实现了存储库,它使用Entity Framework 7(又名实体框架核心)来访问SQL Server数据库)

请注意,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

5
推荐指数
1
解决办法
6258
查看次数

检查触发器是否存在

我对公共模式中所有表的触发器有以下查询:

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)

postgresql dynamic-sql plpgsql database-trigger

5
推荐指数
2
解决办法
7628
查看次数