I'd like to have a way to pass in `Execute as User` for raw SQL queries for
tinytds
I can sort of hack my way through it-
*Behavior I get*
2.1.8p440 :001 > a = Sequel.connect(
"tinytds://#{ENV['SQL_SERVER_development_USERNAME']}:#{ENV['SQL_SERVER_development_PASSWORD']}@#{ENV['SQL_SERVER_development_HOST']}:#{ENV['SQL_SERVER_development_PORT']}/#{ENV['SQL_SERVER_development_DB']}"
)
=> #<Sequel::TinyTDS::Database:
"tinytds://user:password@host:port/database">
## First thing we do is connect to the database, then run a query.
2.1.8p440 :002 > d = a['SELECT * FROM [secure].[Employee Snapshot Fact]
[Employee Snapshot Fact]']
=> #<Sequel::TinyTDS::Dataset: "SELECT * FROM [secure].[Employee Snapshot
Fact] [Employee Snapshot Fact]">
2.1.8p440 :003 > d.first
=> nil
2.1.8p440 :004 > d.count
=> 0
## We see that the connection doesn't work without the user passing through
2.1.8p440 :002 > d = a["EXECUTE AS USER='ADND\\user'; SELECT * FROM
[secure].[Employee Snapshot Fact] [Employee Snapshot Fact]"]
=> #<Sequel::TinyTDS::Dataset: "EXECUTE AS USER='ADND\\user'; SELECT *
FROM [secure].[Employee Snapshot Fact] [Employee Snapshot Fact]">
2.1.8p440 :003 > d.first
=> {:"employee key"=>126, :"job key"=>0, :"active faculty key"=>21, :"faculty
appointment key"=>6, :"date key"=>20020630}
## With the Execute as User - We get a result object back working normally
2.1.8p440 :004 > d.count
Sequel::DatabaseError: TinyTds::Error: Incorrect syntax near the keyword
'EXECUTE'.
from /usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/adapters/
tinytds.rb:220:in `fields'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/adapters/tinytds.rb:220:in
`block in fetch_rows'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/adapters/tinytds.rb:65:in
`block in execute'
from /usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/database/
connecting.rb:251:in `block in synchronize'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/connection_pool/threaded.rb:105:in
`hold'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/database/connecting.rb:251:in
`synchronize'
from /usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/adapters/
tinytds.rb:34:in `execute'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/actions.rb:952:in
`execute'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/adapters/tinytds.rb:219:in
`fetch_rows'
from /usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/
actions.rb:835:in `with_sql_each'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/actions.rb:843:in
`with_sql_first'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/actions.rb:661:in
`single_record!'
from /usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/
actions.rb:649:in `single_record'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/actions.rb:671:in
`single_value'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/actions.rb:249:in
`get'
from /usr/local/rvm/gems/ruby-2.1.8/gems/sequel-4.32.0/lib/sequel/dataset/
actions.rb:105:in `count'
from (irb):4
from
/usr/local/rvm/gems/ruby-2.1.8/gems/railties-4.0.13/lib/rails/commands/console.rb:90:in
`start'
from
/usr/local/rvm/gems/ruby-2.1.8/gems/railties-4.0.13/lib/rails/commands/console.rb:9:in
`start'
from /usr/local/rvm/gems/ruby-2.1.8/gems/railties-4.0.13/lib/rails/commands
.rb:62:in `<top (required)>'
from bin/rails:4:in `require'
## but the count method doesn't work
2.1.8p440 :005 > d = a['SELECT * FROM [secure].[Employee Snapshot Fact]
[Employee Snapshot Fact]']
=> #<Sequel::TinyTDS::Dataset: "SELECT * FROM [secure].[Employee Snapshot
Fact] [Employee Snapshot Fact]">
## We try again, this time WITHOUT the Execute as User statement
2.1.8p440 :006 > d.first
=> {:"employee key"=>126, :"job key"=>0, :"active faculty key"=>21, :"faculty
appointment key"=>6, :"date key"=>20020630}
2.1.8p440 :007 > d.count
=> 4167860
## Somehow the Execute as User statement has been saved? in the query
object and we are able to get back the row count. But then why didn't it
work the first time?
## Is that the ruby object counting or is it returning from the database? I
think it comes from the database because it only takes about a second for
it to compute as 4 million rows in ruby is a lot to compute.
## Maybe my sql query isn't 100% correct
*Behavior I want*
What I'd like to have is a `.count` method that works with Execute as User
statement, that would maybe tack on the Execute as User statement. Or just
have the original statement work.
d.count("EXECUTE AS USER='ADND\\user';")
=> 12345678
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.