|
From: <rom...@us...> - 2014-07-14 13:12:15
|
Revision: 59872
http://sourceforge.net/p/firebird/code/59872
Author: roman-simakov
Date: 2014-07-14 13:12:12 +0000 (Mon, 14 Jul 2014)
Log Message:
-----------
Improved description of DDL access control operations.
Fixed DB and DDL triggers handling. Thanks to Adriano.
Modified Paths:
--------------
firebird/trunk/doc/sql.extensions/README.ddl_access.txt
firebird/trunk/src/dsql/DdlNodes.epp
Modified: firebird/trunk/doc/sql.extensions/README.ddl_access.txt
===================================================================
--- firebird/trunk/doc/sql.extensions/README.ddl_access.txt 2014-07-14 00:27:26 UTC (rev 59871)
+++ firebird/trunk/doc/sql.extensions/README.ddl_access.txt 2014-07-14 13:12:12 UTC (rev 59872)
@@ -7,13 +7,13 @@
Syntax is:
-GRANT CREATE <OBJECT> TO USER|ROLE [with grant option];
-GRANT ALTER ANY <OBJECT> TO USER|ROLE [with grant option];
-GRANT DROP ANY <OBJECT> TO USER|ROLE [with grant option];
+GRANT CREATE <OBJECT> TO [USER | ROLE] <user/role name> [with grant option];
+GRANT ALTER ANY <OBJECT> TO [USER | ROLE] <user/role name> [with grant option];
+GRANT DROP ANY <OBJECT> TO [USER | ROLE] <user/role name> [with grant option];
-REVOKE [grant option for] CREATE <OBJECT> FROM USER|ROLE;
-REVOKE [grant option for] ALTER ANY <OBJECT> FROM USER|ROLE;
-REVOKE [grant option for] DROP ANY <OBJECT> FROM USER|ROLE;
+REVOKE [grant option for] CREATE <OBJECT> FROM [USER | ROLE] <user/role name>;
+REVOKE [grant option for] ALTER ANY <OBJECT> FROM [USER | ROLE] <user/role name>;
+REVOKE [grant option for] DROP ANY <OBJECT> FROM [USER | ROLE] <user/role name>;
Where <OBJECT> could be:
TABLE, VIEW, PROCEDURE, FUNCTION, PACKAGE, GENERATOR, SEQUENCE, DOMAIN,
Modified: firebird/trunk/src/dsql/DdlNodes.epp
===================================================================
--- firebird/trunk/src/dsql/DdlNodes.epp 2014-07-14 00:27:26 UTC (rev 59871)
+++ firebird/trunk/src/dsql/DdlNodes.epp 2014-07-14 13:12:12 UTC (rev 59872)
@@ -3157,9 +3157,16 @@
bool CreateAlterTriggerNode::checkPermission(thread_db* tdbb, jrd_tra* transaction)
{
- dsc dscName;
- dscName.makeText(relationName.length(), CS_METADATA, (UCHAR*) relationName.c_str());
- SCL_check_relation(tdbb, &dscName, SCL_alter);
+ if (relationName.hasData())
+ {
+ dsc dscName;
+ dscName.makeText(relationName.length(), CS_METADATA, (UCHAR*) relationName.c_str());
+ SCL_check_relation(tdbb, &dscName, SCL_alter);
+ }
+ else
+ {
+ SCL_check_database(tdbb, SCL_alter);
+ }
return true;
}
@@ -3335,7 +3342,6 @@
bool DropTriggerNode::checkPermission(thread_db* tdbb, jrd_tra* transaction)
{
- dsc dscName;
MetaName relationName;
AutoCacheRequest request(tdbb, drq_l_trigger_relname, DYN_REQUESTS);
@@ -3350,12 +3356,15 @@
if (relationName.isEmpty())
{
- // msg 48: "Index not found"
- status_exception::raise(Arg::PrivateDyn(48));
+ SCL_check_database(tdbb, SCL_alter);
}
+ else
+ {
+ dsc dscName;
+ dscName.makeText(relationName.length(), CS_METADATA, (UCHAR*) relationName.c_str());
+ SCL_check_relation(tdbb, &dscName, SCL_alter);
+ }
- dscName.makeText(relationName.length(), CS_METADATA, (UCHAR*) relationName.c_str());
- SCL_check_relation(tdbb, &dscName, SCL_alter);
return true;
}
@@ -3390,9 +3399,6 @@
break;
}
- if (X.RDB$RELATION_NAME.NULL && !transaction->getAttachment()->locksmith())
- status_exception::raise(Arg::Gds(isc_adm_task_denied));
-
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, DDL_TRIGGER_DROP_TRIGGER, name);
relationName = X.RDB$RELATION_NAME;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|