Skip to content

Add functionality to FakeTable synonyms for remote tables/views #72

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Build/Build.ssmssqlproj
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@
<AssociatedConnUserName />
<FullPath>GrantBuildPermissions.sql</FullPath>
</FileNode>
<FileNode Name="GrantUserAccessToRemoteDatabase.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>GrantUserAccessToRemoteDatabase.sql</FullPath>
</FileNode>
<FileNode Name="Install(master.tSQLt_testutil).sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
Expand Down
7 changes: 7 additions & 0 deletions Build/GrantUserAccessToRemoteDatabase.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
IF EXISTS ( SELECT 1
FROM sys.databases
WHERE name = 'tSQLt_RemoteSynonymsTestDatabase' )
BEGIN

EXEC dbo.sp_changedbowner @loginame = N'tSQLt.Build';
END;
2 changes: 2 additions & 0 deletions Build/tSQLt.build
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@
<copy file="CreateBuildDb.sql" todir="temp"/>
<copy file="Drop(master.tSQLt_testutil).sql" todir="temp"/>
<copy file="Install(master.tSQLt_testutil).sql" todir="temp"/>
<copy file="GrantUserAccessToRemoteDatabase.sql" todir="temp"/>
<copy file="GetTestResults.sql" todir="temp"/>
<copy file="GetFailedTestCount.sql" todir="temp"/>
<copy file="../Examples/TestThatExamplesAreDeployed.sql" todir="temp"/>
Expand All @@ -286,6 +287,7 @@
<include name="EnableExternalAccess.sql"/>
<include name="Drop(master.tSQLt_testutil).sql"/>
<include name="Install(master.tSQLt_testutil).sql"/>
<include name="GrantUserAccessToRemoteDatabase.sql"/>
<include name="ChangeDbAndExecuteStatement(tSQLt.Build).sql"/>
<include name="CreateBuildDb.sql"/>
<include name="GetTestResults.sql"/>
Expand Down
2 changes: 2 additions & 0 deletions Build/tSQLt.build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@
<copy file="CreateBuildDb.sql" todir="temp"/>
<copy file="Drop(master.tSQLt_testutil).sql" todir="temp"/>
<copy file="Install(master.tSQLt_testutil).sql" todir="temp"/>
<copy file="GrantUserAccessToRemoteDatabase.sql" todir="temp"/>
<copy file="GetTestResults.sql" todir="temp"/>
<copy file="GetFailedTestCount.sql" todir="temp"/>
<copy file="../Examples/TestThatExamplesAreDeployed.sql" todir="temp"/>
Expand All @@ -300,6 +301,7 @@
<include name="EnableExternalAccess.sql"/>
<include name="Drop(master.tSQLt_testutil).sql"/>
<include name="Install(master.tSQLt_testutil).sql"/>
<include name="GrantUserAccessToRemoteDatabase.sql"/>
<include name="ChangeDbAndExecuteStatement(tSQLt.Build).sql"/>
<include name="CreateBuildDb.sql"/>
<include name="GetTestResults.sql"/>
Expand Down
4 changes: 4 additions & 0 deletions Build/tSQLt.validatebuild
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@
<property name="execute.sql.filename" value="temp/Install(master.tSQLt_testutil).sql" />
<call target="execute.sql.file" />

<property name="execute.sql.elevated" value="true" />
<property name="execute.sql.filename" value="temp/GrantUserAccessToRemoteDatabase.sql" />
<call target="execute.sql.file" />

<property name="execute.sql.elevated" value="true" />
<property name="execute.sql.filename" value="temp/Drop(tSQLtExternalAccessKey).sql" />
<call target="execute.sql.file" />
Expand Down
6 changes: 6 additions & 0 deletions Build/tSQLt.validatebuild.xml
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,12 @@
<param name="execute.sql.filename" value="temp/Install(master.tSQLt_testutil).sql" />
</antcall>

<antcall target="execute.sql.file">
<param name="execute.sql.database" value="${db.name}" />
<param name="execute.sql.elevated" value="true" />
<param name="execute.sql.filename" value="temp/GrantUserAccessToRemoteDatabase.sql" />
</antcall>

<antcall target="execute.sql.file">
<param name="execute.sql.database" value="${db.name}" />
<param name="execute.sql.elevated" value="true" />
Expand Down
11 changes: 11 additions & 0 deletions Source/BuildOrder.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,20 @@ tSQLt.Private_Bin2Hex.sfn.sql
tSQLt.Private_NewTestClassList.tbl.sql
tSQLt.Private_ResetNewTestClassList.ssp.sql
tSQLt.Private_SysTypes.svw.sql
tSQLt.Private_SysColumns.svw.sql
tSQLt.Private_SysComputedColumns.svw.sql
tSQLt.Private_SysDefaultConstraints.svw.sql
tSQLt.Private_SysIdentityColumns.svw.sql
tSQLt.Private_SysObjects.svw.sql
tSQLt.Private_SysSchemas.svw.sql
tSQLt.Private_GetFullTypeName.sfn.sql
tSQLt.Private_DisallowOverwritingNonTestSchema.ssp.sql
tSQLt.Private_CreateRemoteSysObjects.ssp.sql
tSQLt.Private_GetRemoteObjectId.ssp.sql
tSQLt.Private_AlterSysObjectForRemote.ssp.sql
tSQLt.Private_QuoteClassNameForNewTestClass.sfn.sql
tSQLt.Private_MarkSchemaAsTestClass.ssp.sql
tSQLt.Private_ValidateSynonymCompatibilityWithFakeTable.ssp.sql
tSQLt.NewTestClass.ssp.sql
tSQLt.Fail.ssp.sql
tSQLt.class.sql
Expand Down Expand Up @@ -48,6 +58,7 @@ tSQLt.Private_GetDataTypeOrComputedColumnDefinition.sfn.sql
tSQLt.Private_GetIdentityDefinition.sfn.sql
tSQLt.Private_GetDefaultConstraintDefinition.sfn.sql
tSQLt.Private_GetUniqueConstraintDefinition.sfn.sql
tSQLt.Private_CreateRemoteUserDefinedDataTypes.ssp.sql
tSQLt.Private_CreateFakeOfTable.ssp.sql
tSQLt.Private_MarkFakeTable.ssp.sql
tSQLt.FakeTable.ssp.sql
Expand Down
62 changes: 61 additions & 1 deletion Source/Source.ssmssqlproj
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,12 @@
<AssociatedConnUserName />
<FullPath>tSQLt.NewTestClass.ssp.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_AlterSysObjectForRemote.ssp.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_AlterSysObjectForRemote.ssp.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_Bin2Hex.sfn.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
Expand Down Expand Up @@ -241,6 +247,18 @@
<AssociatedConnUserName />
<FullPath>tSQLt.Private_CreateFakeFunction.ssp.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_CreateRemoteSysObjects.ssp.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_CreateRemoteSysObjects.ssp.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_CreateRemoteUserDefinedDataTypes.ssp.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_CreateRemoteUserDefinedDataTypes.ssp.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_CreateProcedureSpy.ssp.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
Expand Down Expand Up @@ -295,6 +313,12 @@
<AssociatedConnUserName />
<FullPath>tSQLt.Private_GetForeignKeyDefinition.sfn.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_GetRemoteObjectId.ssp.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_GetRemoteObjectId.ssp.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_GetUniqueConstraintDefinition.sfn.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
Expand Down Expand Up @@ -421,12 +445,48 @@
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SqlVersion.sfn.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysColumns.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysColumns.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysComputedColumns.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysComputedColumns.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysDefaultConstraints.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysDefaultConstraints.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysIdentityColumns.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysIdentityColumns.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysIndexes.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysIndexes.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysObjects.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysObjects.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysSchemas.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLt.Private_SysSchemas.svw.sql</FullPath>
</FileNode>
<FileNode Name="tSQLt.Private_SysTypes.svw.sql">
<AssociatedConnectionMoniker>8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True</AssociatedConnectionMoniker>
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
Expand Down Expand Up @@ -528,7 +588,7 @@
<AssociatedConnSrvName>Dev_tSQLt</AssociatedConnSrvName>
<AssociatedConnUserName />
<FullPath>tSQLtCLR_CreateProcs.sql</FullPath>
</FileNode>
</FileNode>
</Items>
</LogicalFolder>
<LogicalFolder Name="Miscellaneous" Type="3" Sorted="true">
Expand Down
42 changes: 23 additions & 19 deletions Source/tSQLt.FakeTable.ssp.sql
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@ BEGIN
DECLARE @OrigTableName NVARCHAR(MAX);
DECLARE @NewNameOfOriginalTable NVARCHAR(4000);
DECLARE @OrigTableFullName NVARCHAR(MAX); SET @OrigTableFullName = NULL;

DECLARE @RemoteObjectID INT;
DECLARE @SynonymObjectId INT;

SELECT @OrigSchemaName = @SchemaName,
@OrigTableName = @TableName

IF(@OrigTableName NOT IN (PARSENAME(@OrigTableName,1),QUOTENAME(PARSENAME(@OrigTableName,1)))
AND @OrigSchemaName IS NOT NULL)
BEGIN
RAISERROR('When @TableName is a multi-part identifier, @SchemaName must be NULL!',16,10);
END
BEGIN
RAISERROR('When @TableName is a multi-part identifier, @SchemaName must be NULL!',16,10);
END

SELECT @SchemaName = CleanSchemaName,
@TableName = CleanTableName
Expand All @@ -31,25 +33,27 @@ BEGIN

EXEC tSQLt.Private_RenameObjectToUniqueName @SchemaName, @TableName, @NewNameOfOriginalTable OUTPUT;

SELECT @OrigTableFullName = S.base_object_name
FROM sys.synonyms AS S
WHERE S.object_id = OBJECT_ID(@SchemaName + '.' + @NewNameOfOriginalTable);

IF(@OrigTableFullName IS NOT NULL)
BEGIN
IF(COALESCE(OBJECT_ID(@OrigTableFullName,'U'),OBJECT_ID(@OrigTableFullName,'V')) IS NULL)
BEGIN
RAISERROR('Cannot fake synonym %s.%s as it is pointing to %s, which is not a table or view!',16,10,@SchemaName,@TableName,@OrigTableFullName);
END;
END;
ELSE
BEGIN
SET @OrigTableFullName = @SchemaName + '.' + @NewNameOfOriginalTable;
END;
SET @OrigTableFullName = @SchemaName + '.' + @NewNameOfOriginalTable;
SET @SynonymObjectId = OBJECT_ID(@OrigTableFullName, 'SN');
IF ( @SynonymObjectId > 0)
BEGIN
EXEC tSQLt.Private_GetRemoteObjectId @SynonymObjectId = @SynonymObjectId ,
@RemoteObjectId = @RemoteObjectID OUTPUT,
@OrigTableFullName = @OrigTableFullName OUTPUT

EXEC tSQLt.Private_CreateFakeOfTable @SchemaName, @TableName, @OrigTableFullName, @Identity, @ComputedColumns, @Defaults;
EXEC tSQLt.Private_ValidateSynonymCompatibilityWithFakeTable @TableName, @SchemaName, @OrigTableFullName;
END;

EXEC tSQLt.Private_CreateFakeOfTable @SchemaName, @TableName, @OrigTableFullName, @Identity, @ComputedColumns, @Defaults, @RemoteObjectID;

EXEC tSQLt.Private_MarkFakeTable @SchemaName, @TableName, @NewNameOfOriginalTable;

IF (@RemoteObjectID IS NOT NULL)
BEGIN
EXEC tSQLt.Private_CreateRemoteSysObjects @Instance = NULL, @Database = NULL;
END

END
---Build-
GO
49 changes: 49 additions & 0 deletions Source/tSQLt.Private_AlterSysObjectForRemote.ssp.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
IF OBJECT_ID('tSQLt.Private_AlterSysObjectForRemote') IS NOT NULL
DROP PROCEDURE tSQLt.Private_AlterSysObjectForRemote;
GO
---Build+
CREATE PROCEDURE tSQLt.Private_AlterSysObjectForRemote
@Instance NVARCHAR(MAX) ,
@Database NVARCHAR(MAX) ,
@SysObject NVARCHAR(MAX) ,
@PrivateViewName NVARCHAR(MAX)
AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'ALTER VIEW tSQLt.' + @PrivateViewName + ' AS
SELECT ' +
CASE WHEN @SysObject = 'types' THEN '
name ,
system_type_id ,
user_type_id ,
CASE WHEN is_user_defined = 1 THEN 1
ELSE schema_id
END AS schema_id ,
principal_id ,
max_length ,
precision ,
scale ,
collation_name ,
is_nullable ,
is_user_defined ,
is_assembly_type ,
default_object_id ,
rule_object_id ,
is_table_type
' ELSE '* ' END
+ CASE WHEN CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR(MAX)) LIKE '9.%'
AND @SysObject = 'types' THEN ',0 is_table_type'
ELSE ''
END + ' FROM ' + COALESCE(QUOTENAME(@Instance) + '.', '')
+ COALESCE(QUOTENAME(@Database) + '.', '') + 'sys.' + @SysObject
+ ';';




EXEC (@sql);

RETURN 0;
END;
---Build-
GO
12 changes: 9 additions & 3 deletions Source/tSQLt.Private_CreateFakeOfTable.ssp.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ CREATE PROCEDURE tSQLt.Private_CreateFakeOfTable
@OrigTableFullName NVARCHAR(MAX),
@Identity BIT,
@ComputedColumns BIT,
@Defaults BIT
@Defaults BIT,
@RemoteObjectID INT
AS
BEGIN
DECLARE @Cmd NVARCHAR(MAX);
DECLARE @Cols NVARCHAR(MAX);

IF (@RemoteObjectID IS NOT NULL)
BEGIN
EXEC tSQLt.Private_CreateRemoteUserDefinedDataTypes @RemoteObjectID = @RemoteObjectID
END

SELECT @Cols =
(
Expand All @@ -25,11 +31,11 @@ BEGIN
THEN ''
ELSE ' NULL'
END
FROM sys.columns c
FROM tSQLt.Private_SysColumns c
CROSS APPLY tSQLt.Private_GetDataTypeOrComputedColumnDefinition(c.user_type_id, c.max_length, c.precision, c.scale, c.collation_name, c.object_id, c.column_id, @ComputedColumns) cc
CROSS APPLY tSQLt.Private_GetDefaultConstraintDefinition(c.object_id, c.column_id, @Defaults) AS dc
CROSS APPLY tSQLt.Private_GetIdentityDefinition(c.object_id, c.column_id, @Identity) AS id
WHERE object_id = OBJECT_ID(@OrigTableFullName)
WHERE object_id = COALESCE(@RemoteObjectID, OBJECT_ID(@OrigTableFullName))
ORDER BY column_id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)');
Expand Down
Loading