Querying a view that retrieves data from a linked server - sql-server

I have an emergency for which i must give a reply in short time.
I wrote an application that allows the user to query a single sql server db (MyDB from now on).
I assumed that to query other dbs (Oracles, csv, ...) the trick was:
1) creating a linked server on the same server wher the MyDB is
2) on MyDb creating a view that somehow selects data from a table on the linked server
Now I am not sure that (2) is possible. i am trying to create a linked server with Excel but with failure, this is why I asked also this.
So my question is:
is it possible to run
select * from VIEW_WITH_DATA_FROM_LINKED_SERVER
if the connection is made to MyDB and VIEW_WITH_DATA_FROM_LINKED_SERVER is a view belonging to MyDb?
Thanks!

You can create a view using linked server by below query.
USE [SNHU_Reporting]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE view [dbo].[VIEW_WITH_DATA_FROM_LINKED_SERVER] AS
SELECT * FROM [Servername].db_name.dbo.tablename --dbo is the schema name.
GO

Related

Getting data from another Database within procedure in DB2

I have two databases DB1 and DB2 and I want to call a stored procedure in DB1 and get data from DB2.
Create procedure diffdbtest()
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN
DECLARE C1 CURSOR WITH RETURN FOR
SELECT * FROM Db2.myschema.tabletest;
OPEN C1
END#
I get Db2.myschema.tabletest is not defined.
Both DBs have the same user and password (if possible how can I use different users?)
Any idea what is wrong?
Running DB2 Express v10.5 Windows
Thanks.
The only way as far as I know is you have to use federation. You need to:
create server wrapper to DB #2
create nickname on table that is referring the table tabletest
create user mapping
etc.
Then, you can access that table via nickname.
Details on how to do this can be found in knowledge center: https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.data.fluidquery.doc/topics/tlsdb201.html
Hope this helps.
Kevin See
Db2 Hybrid Cloud Security Dev Team

SQL Server Trigger on a Linked Server for reporting services

I have and SQL server with a report table that is linked to an SQL database on a separate server. The linked server is maintained by a 3rd party vendor so I'd rather not add triggers... I was hoping to run a report based on a value being inserted on a linked table. Tried the following:
CREATE TRIGGER [dbo].[RunReport] ON [linkedServer].[database].[dbo].
[CustomerComments]
FOR INSERT
AS
exec [ReportServer].dbo.AddEvent #EventType='TimedSubscription',
#EventData='xxxxx'
I get the error "contains more than the maximum number of prefixes. The maximum is 2." Anyway to trigger my report without altering the linked database. I also created a view of the linked table that didn't work either.
Thanks,
Leaving aside the idea, you can create the trigger on linked server this way:
exec [linkedServer].[database].sys.sp_executesql N'CREATE TRIGGER [dbo].[RunReport] ON [dbo].
[CustomerComments]
FOR INSERT
AS
exec [ReportServer].dbo.AddEvent #EventType='TimedSubscription',
#EventData='xxxxx'

Query database running on another physical SQL Server

Historically we have a product which installed two databases on the same server. There is an custom application which assumes that both databases are on the same server.
In a new version they have split the databases onto two separate servers and obviously now the custom application is giving the error:
Database 'DB_2' does not exist. Make sure that the
name is entered correctly.
Is there anything I can do in the SQL Server setup so that the application is still able to query the DB_2 database without modifying the custom application?
The query being used is structured as follows:
Use DB_2
SELECT * FROM MyUser.MyTable
You can create a linked Server, then Create a Database DB_2 add a Synonym for different objects. something like below.
use master
GO;
EXEC master.dbo.sp_addlinkedserver #server = N'RemoteServer', #srvproduct=N'SQL Server'
GO
CREATE DATABASE [DB_2];
GO
USE [DB_2]
GO
CREATE SYNONYM [MyUser].[MyTable] FOR [RemoteServer].[db].[MyUser].[MyTable]
GO
You can use Linked Servers feature. In SSMS go to Server Object/Linked Servers folder in Object Explorer. And link second server. So you can query another DB using this SELECT * FROM [Linked_Server_Name].[Database_Name].[Schema_Name].[Table_Name]

how to transfer data from one server to another dynamically..?

I have many linked servers that contains similar databases, Now i am asked to make a stored procedure to transfer data from database of one sever to another server's database. but I am supposed to give the destination server name, source server name, destination database name, souce database name as parameters to the stored proc.
I am able to do it between different databases of the same server using dynamic sql.
SET #dynsql =N'INSERT INTO '+#destinationDBname+N'..UIElement (UIElementID,UIElementName)
SELECT #LatestUIElementId,UIElementName
FROM '+QUOTENAME(#sourceDBname)+N'.dbo.UIElement WHERE UIElementID = #OldUIElementId'
EXEC sp_executesql #dynsql,N'#LatestUIElementId int',#LatestUIElementId =#LatestUIElementId
but unable to find a way which can be used between servers.
It seems to me that you are missing destination server in your query. From what I see above you only have destination database.
Query for destination server should look like this
select * from [Server].database.schema.table

SQL Server cross database alias

I'm trying to understand how I can use an alias to reference another database in the same instance, without having to use a hardcoded name.
The scenario is as below:
I have a data db with stores data, an audit db which keeps all changes made. for various reason, i want to keep the audit data in a separate database, not least because it can get quite large and for reporting purposes.
In the data db, I don't want to reference this by a hardcoded name but an alias so that in different environments, I don't have to change the name and various sp's to reference the new name.
for example:
mydevdata
mydevaudit
If a sp exists in mydevdata such as which calls the mydevaudit, I don't want to change the sp when I go to test where the db's may be called mytestdata and mytestaudit. Again, for various reasons, the database names can change, more to do with spaces an instances etc.
So if I had procedure in mydevdata:
proc A
begin
insert into mydevaudit.table.abc(somecol)
select 1
end
when I go to test, I don't want to be change the procedure to reference another name, (assume for sake of argument that happened)
Instead I am looking to do something like:
proc A
begin
insert into AUDITEBALIAS.table.abc(somecol)
select 1
end
I am interested in finding out how I could do something like that, and the pro's and cons.
Also, dymnamic SQL is not an option.
thanks in advance for you help.
You may be able to use synonyms
CREATE SYNONYM WholeTableAliasWithDBetc FOR TheDB.dbo.TheTable
This means all object references in the local DB are local to that DB, except for synonyms that hide the other database from you.
You can also use stored procedures in the audit DB. There is a 3rd form of EXEC that is little used where you can parametrise the stored proc name
DECLARE #module_name_var varchar(100)
SET #module_name_var = 'mydevaudit.dbo.AuditProc'
-- SET #module_name_var = 'whatever.dbo.AuditProc'
EXEC #module_name_var #p1, #p2, ...
Obviously you can change module_name_var to use whatever DB you like
I've just posted this to How to create Sql Synonym or "Alias" for Database Name? which is a workaround for the same situation:
There is a way to simulate this using a linked server. This assumes you have two SQL servers with the same set of databases one for development/test and one live.
Open SQL Server Management Studio on your development/test server
Right click Server Objects > Linked Servers
Select New Linked Server...
Select the General page
Specify alias name in Linked server field - this would normally be the name of your live server
Select SQL Native Client as the provider
Enter sql_server for Product Name
In Data Source specify the name of the development server
Add Security and Server Options to taste
Click OK
The above is for SQL Server 2005 but should be similar for 2008
Once you've done that you can write SQL like this:
SELECT * FROM liveservername.databasename.dbo.tablename
Now when your scripts are run on the development server with the linked server back to itself they will work correctly pulling data from the development server and when the exact same scripts are run on the live server they will work normally.

Resources